2017-10-25 19 views
5

正規表現(php)を使用して、アルファベット以外の文字(大文字と小文字は区別されません)が続く特定の文字列を検索しようとしています。Regex:文字列の後に英数字以外の文字列を見つける方法

Example String: 
Doggy is a lazy dog! Doggy. Dog and I. 

Search String: Dog 

Expected Result: 
Doggy is a lazy <a href="">dog</a>! Doggy. <a href="">Dog</a> and I. 

Dogの部分文字列の後ろにアルファベット以外の文字がないため、「Doggy」と一致しないはずです。

私はこれらの行に沿って何かをしようとしていますが、私が欲しいものを正確にやっていません。

preg_replace("/(dog)[^a-zA-Z0-9\s\p]/i/", "", $str); 
+1

はなぜ除外する文字のリストで '\のS'を持っています?そうすれば、「犬」とそれに続くスペースは一致しません。 – Barmar

+1

実際には**正確な単語の一致**を検索しようとしていますか? 「文字列の後に非英数字が続く」ではありませんか? –

+2

単語境界パターン '\ b'を使うのはどうですか? – Barmar

答えて

4

それはあなたがが実際にここでやろうとしているもののように私には聞こえるが正確な単語マッチを行うことです。必ずしも "文字列の後に英数字ではない"とは限りません。

あなたは\b「単語の境界」正規表現のアンカーでこれを達成することができます

$search = "dog" 
preg_replace("/\b".$search."\b/i", "", $str); 
1

あなたの正規表現は、ほぼ上のスポットですが、いくつかのエラーがある:

  1. は、私はあなたがしたいと仮定それ以降に空白がある場合はDogと一致するようにしてください。\s
  2. \pは有効な正規表現文字ではありません。
  3. \iの後ろにスラッシュを追加しないでください。 \i\ - >\i
  4. あなたの正規表現は現在のところ、英数字以外の文字は削除されますが、これはキャプチャグループ内で囲んで修正できます。

アンカータグ(<a href=""></a>)を追加するコードもありません。

だから、私が行って、以下の文の中に、これらすべてをまとめました:

preg_replace("/(dog)([^a-zA-Z0-9])/i", '<a href="">$1</a>$2', $str); 

これが返されます。

Doggy is a lazy <a href="">dog</a>! Doggy. <a href="">Dog</a> and I. 
関連する問題