2012-03-13 24 views
5

str_replace()は ":Name:Name_en"に ":Name"を2回マッチさせるので、単語全体の結果のみを照合したいと思います。 this answerのため、preg_replace()に切り替える必要がありました。str_replace:単語全体に一致

$str = ":Name :Name_en"; 
echo $str . chr(10); 
$str = preg_replace('/\b' . ':Name' . '\b/i', '"Test"', $str); 
echo $str; 

しかし、これはコロンのために機能しません。交換は行われません。 RegExpはどのように見えますか?

\bは単語境界です。しかし、私は結腸がそのような単語の境界に属していないと思う。

+2

「単語」の*あなたの*定義が何であるかを教えてください。 – Jon

+0

私の言葉全体は ':Name'、':Name_en'などです。 RegExpについては分かりません。 – testing

+0

これは定義ではありません。 – Jon

答えて

9

あなたは、文字列の先頭にワード境界を必要としません:

$str = preg_replace('/:Name\b/i', '"Test"', $str); 
+0

時にはとても簡単です。 '/'、 '\ b'、'/i'のようなRegExpが簡単に説明できる良いリンクがありますか? – testing

+0

オフではない:)私はphp.netのドキュメントがかなり良いと思った – Evert

+0

良いリンクを探している人には - http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ – Styphon

1

あなたは、あなたがまだstr_replaceを使用することができます5+ PHPを使用している場合。

$str = ":Name :Name_en"; 
echo $str . chr(10); 

// The final int limits the function to a single replace. 
$str = str_replace(':Name', '"Test"', $str, 1); 

echo $str; 
+0

しかしどのアイテムそれは置き換えますか?最初のもの、最後のもの、...?私のアプリケーションでは、この変更は... – testing

+1

最初のものです。 str_replaceはシーケンシャルです。 – Bradmage

+1

それは、ドキュメントが言っているようではありません: 'カウント:渡された場合、これは実行された置換の数に設定されます。それは可変参照であり、定数ではありません。 – jokkedk

1

あなたは、辞書やプレースホルダのようなものを連想している複数のキーワードを交換したい場合は、あなたが正規表現パターンに一致するように、これを使用することができます。

$words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow"); 
$source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ , _no_match_"; 

echo (preg_replace_callback("/\b_(\w*)_\b/", function($match) use ($words) { if(isset($words[$match[0]])){ 
return ($words[$match[0]]);}else{ return($match[0]);}}, $source)); 

戻り値:こんにちは!私の動物は猫で、それはMEooowだと言います。

"_no_match_"は翻訳が欠けていますが、正規表現では一致しますが、そのキーは保持されます。

+0

これにより、異なるキーで複数の置換を行うことができます – Miguel

関連する問題