-

PHPで始点となる文字列(キーワード)と終点となる文字列(キーワード)を指定して、その間の文字列を削除する方法を探しています。

例えば、

Web制作のお悩みを解決するQ&Aとキュレーションサービス

という文のうち、削除をする始まりの文字列を「お悩み」と指定して、削除が終わる文字列を「キュレーション」としたとき、その間の文字列を含めた「お悩みを解決するQ&Aとキュレーション」を削除して「Web制作のサービス」とはきだしてくれる感じです。

キーワードは文章中に複数回出現を想定して、「お悩み」がでてきたら「キュレーション」がでてくるところまでを削除、また「お悩み」がでてきたら「キュレーション」が出てくるまで削除...というのを考えております。
仮に「お悩み」があって「キュレーション」がなかった場合は、「お悩み」が登場以降は全削除を想定しています。

質問の仕方が下手ですいませんが、教えて頂けると幸いです。

みんなの回答 4 件

名無しさんの回答

$search_str = ’Web制作のお悩みを解決するQ&Aとキュレーションサービス’;
$keyword_start = ’お悩み’;
$keyword_end = ’キュレーション’;

preg_match(’/’.$keyword_start.’(.*?)’.$keyword_end.’/’, $search_str, $match);
echo $match[0];
// $match[0] → お悩みを解決するQ&Aとキュレーション

名無し

この回答を使用させて頂き一瞬で解決することができました、本当にありがとうございます!

名無し

逆によくこの回答で分かったな。
消した後のが欲しいって言ってんのに、何で preg_match が出てきた?
replace だろ。
てか、ちゃんと preg_quote 通せよ

名無し

ネタで書いたのに。。。

名無し

すいません、実はといいますか、削除する範囲の指定方法がさっぱりわからなかったというのがメインでしたので、

$search_str = preg_replace(’/’.$keyword_start.’(.*?)’.$keyword_end.’/’ , ’’ , $search_str);

という感じにしました。

ですが、1点だけまだ問題がありまして、ある検索文字列($search_str)が最後の$keyword_startが出た後$keyword_endがでてこないで終わるのですが、ここが削除されず残ってしまっています...

すみませんが、もし宜しければ教えて頂きたく...宜しくお願い致します。

名無し

$search_str = ’Web制作のお悩みを解決するQ&Aとキュレーションサービス’;
$keyword_start = ’お悩み’;
$keyword_end = ’キュレーション’;

preg_match(’/’.$keyword_start.’(.*?)’.$keyword_end.’/’, $search_str, $match);
echo $match[0];
// $match[0] → お悩みを解決するQ&Aとキュレーション

function ggrks($keyword_start, $keyword_end, $search_str){
$return_str = ’’;
if(strpos($search_str, $keyword_end) === false){
preg_match(’/’.$keyword_start.’(.*)/’, $search_str, $match);
} else {
preg_match(’/’.$keyword_start.’(.*?)’.$keyword_end.’/’, $search_str, $match);
}
return $match[0];
}

ggrks(’お悩み’, ’キュレーション’, ’Web制作のお悩みを解決するQ&Aとキュレーションサービス’);
// お悩みを解決するQ&Aとキュレーション

ggrks(’お悩み’, ’ググレカス’, ’Web制作のお悩みを解決するQ&Aとキュレーションサービス’);
// お悩みを解決するQ&Aとキュレーションサービス

名無し

ありがとうございました。(.*?)ではなくて(.*)なんですね...
ググことすらまともにできないようでwこの範囲指定に関する記載のあるページが全然見つからず、未だになぜこういう書き方なのかさっぱりわからないのですがとりあえずは解決しまして大変たすかりました。本当にありがとうございます!

名無し

日が経つとコメ主として投稿できんくなるのね。。。
「preg_match」で探しても出ると思うけど、この範囲指定の方法は「正規表現」と言います。詳しいことは ttp://www.mnet.ne.jp/~nakama/ ででも。

名無し

ありがとうございます、やっと理解できました!
今さらながら今までググってきたページを見返すと「正規表現によるマッチングを行う」とか書いてありますね...
こういうところを「preg_match...ああ、文字をマッチングしてくれるのね...」という感じで、重要なところを完全に無視して素通りする自分のセンスが非常になんといいますか、お恥ずかしい限りです。。。

とにもかくにも何度もご返信頂き本当にありがとうございました。
もう少し自力で解決できるよう頑張りたいと思います!

名無しさんの回答

形態素解析使ったほうがいくない?

テキスト解析:日本語形態素解析API - Yahoo!デベロッパーネットワーク

http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html
名無し

上記の方法でとりあえず解決しましたが、情報ご提供ありがとうございます。
色々あるのですね...

名無し

クソワロタwwwwwwwwwwwwv

名無しさんの回答

かなりアナログな方法です。正規表現使用した方が自由度は高そうですね。あくまでサブ的な提案です。思いつきで書いたので穴があったらごめんなさい。

$str = 'Web制作のお悩みを解決するQ&Aとキュレーションサービスですがこのサービスは、お悩みを解決するQ&A解決するQ&Aとキュレーションサービスお悩みを解決するQ&A解決す'; 
 
remove_sandee('お悩み', 'キュレーションサービス', $str); 
 
function remove_sandee($h, $t, $s) { 
 $r = array(); 
 $b = explode($h, $s); 
 foreach ($b as $p) { 
  if (preg_match("/{$t}/", $p)) { 
   $e = explode($t, $p); 
   $e[0] = ''; 
   $r[] = implode($t,$e); 
  } else { 
   $r[] = (!$r) ? $p : ''; 
  } 
 } 
 echo implode($h, $r); 
}
名無し

上の方でツッコんでいる方がいるようにpreg_matchのパターン生成している部分は「preg_quote」通した方が良いですね。普段PHP使わないので、早速穴がありました。申し訳ないです。

名無しさんの回答

このトピ主のレベルがマジで謎
本当は分かって聞いてんじゃないの?
って思うわ。

最終更新日:2012-11-07 (7,530 views)

関連するトピックス

ページ上部に戻る