web-dev-qa-db-ja.com

preg_replaceセレクター内の一致するxxx($ 1)yyyパターンのみを置き換える方法

正規表現を使用して、文字列の一致する部分のみを消去しようとしています。私はpreg_replace関数を使用しており、一致する部分を括弧で囲んで一致するテキストを削除しようとしました。例:

preg_replace('/text1(text2)text3/is','',$html);

これは文字列全体を ''に置き換えます。 text2だけを消去したいのですが、text1とtext3はそのままにしておきます。文字列の一部だけを一致させて置換するにはどうすればよいですか?

31
PartySoft

一致パターンでtext1text3を使用してから、置換文字列を介してそれらを戻す方法があります。次のようにassertionsを使用できます。

preg_replace('/(?<=text1)(text2)(?=text3)/', "", $txt);

このように、正規表現はpresenceのみを検索しますが、置換を適用するときに2つの文字列を考慮しません。

http://www.regular-expressions.info/lookaround.html 詳細については。

41
mario

backreferences (つまり括弧)を使用して、覚えておきたい式の部分だけを保持します。 $1$2などを使用して、置換文字列の内容を呼び出すことができます。

preg_replace('/(text1)text2(text3)/is','$1$2',$html);
36

これを試して:

$text = preg_replace("'(text1)text2(text3)'is", "$1$2", $text);

うまくいきますように!

編集:変更\\1\\2$1$2これが推奨される方法です。

13
aorcsik