1

なぜこのコードは

 $my_replacements = array("my dog", "doga");
 $my_string = "doga my dog test";
 $my_patterns = array_map(function($my_text) { return "/(^|[\n\r\f\t \.\,])" . trim($my_text) . "([\n\r\f\t \.\,]|$)/iu"; }, $my_replacements);
 $replaced_string = preg_replace($my_patterns, '', $my_string);
 echo $replaced_string;

dogatestの代わりに戻るtest

しかし、my_stringがに変更された場合、my_replacements"my dog doga test"の両方の要素が正しく置き換えられますか?

私が達成したいのは、文字列が与えられたら、$ my_replacementsにあるすべての文字列を見つけて、それらを文字列から削除することです。/u修飾子と/i修飾子またはpreg_replaceを考慮に入れます。これは、サブストリングが大文字である可能性があり、どちらの方法でも削除する必要があるためです。

4

2 に答える 2

2

置換は次の正規表現に変換されるため:

/(^|[\n\r\f\t \.\,])my dog([\n\r\f\t \.\,]|$)/iu
/(^|[\n\r\f\t \.\,])doga([\n\r\f\t \.\,]|$)/iu

最初の正規表現がソース文字列に適用された後、その周りのスペース"my dog doga test"でを切り取ります。だからあなたは得る。dog doga dogatest

その後、2番目の正規表現はdoga、文字列、スペース、または句読点の最初または最後で囲まれていることを想定しているため、何にも一致しません。しかし、あなたの場合、それは文字列の先頭(true)にありますが、()の後にスペース、句読点、または文字列の終わりはありませんfalse

そのため、2番目の正規表現は文字列を変更せずdogatest、最終結果として取得されます。

正規表現のない簡単なソリューション:

 $my_replacements = array("my dog", "doga");
 $my_string = "doga my dog test";
 $replaced_string = str_replace($my_replacements, '', $my_string);
 echo $replaced_string;

種類@Asadは、スクリプトのコードパッドデモを作成しました:http://codepad.org/ywbZR1i8

于 2012-11-29T10:23:30.687 に答える
1

str_replaceを使用しない理由はありますか?はいの場合、理由
$my_replacements = array("doga", "my dog");
の代わりに使用でき
$my_replacements = array("my dog", "doga");

ます。文字列で「doga」が「」に置き換えられると、これは「dogatest」になります。したがって、(正規表現を定義したように)スペースのあるドーガはありません。また、''の代わりに""で
$replaced_string = preg_replace($my_patterns, ' ', $my_string);
置換し、複数のスペースすべてを1つのスペースでトリミングして置換することもできます(単純な再帰的置換)。

于 2012-11-29T10:37:02.213 に答える