文字列に含まれる可能性のあるいくつかの単語の最初と最後の文字を一致させようとしていました。で正規表現を使用していました|
。
次の文字列を見てみましょう。
The quick brown fox jumps over the lazy dog
fox
またはのどちらかに一致させたいdog
ので、次の正規表現を作成しました。
/fox|dog/
PHPを使用するpreg_replace
と、その正規表現は正しく機能します。
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace('/fox|dog/', '=>$0<=', $str);
これはエコーします:
The quick brown =>fox<= jumps over the lazy =>dog<=
それは私が望む結果ではありません。そのため、その正規表現から始めて、結果が次のようになるように変更しようとしました。
The quick brown =>f...x<= jumps over the lazy =>d...g<=
私はこのコードで試しました:
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace('/(f)o(x)|(d)o(g)/', '=>$1...$2<=', $str);
これは私が望むものを生み出しませんでした。これはエコーしました:
The quick brown =>f...x<= jumps over the lazy =>...<=
いくつかのデバッグの後、私はその理由を理解しました。私が使っ|
ていたので、それは各単語に別々に一致するだろうと思いましたが、そうではありません。私が思ったように、は逆参照ですが、そうf
ではありません。これは実際には後方参照です!これは、グループが、のどちら側が一致するかだけでなく、正規表現全体を対象としているためです。ただし、後方参照は常に一致する(または)という単語であるため、少し混乱しています。1
d
d
3
|
0
fox
dog
逆参照を使用して、複数の単語の最初と最後の文字を一致させるにはどうすればよいですか?
を使用して解決策を見つけましたpreg_replace_callback
が、後方参照を使用してこれと同じ結果を得ることができるかどうか疑問に思いました。
$str = 'The quick brown fox jumps over the lazy dog';
echo preg_replace_callback('/fox|dog/', function($matches){
$a = $matches[0];
return '=>'.$a[0].'...'.$a[strlen($a)-1].'<=';
}, $str);