「一致した部分に処理をしてから置き換えがしたい」
$hoge = preg_replace("/abc(.+?)def/i", "abd" . shori($1) . "def", $hoge);
このままだと「Parse error: parse error, expecting `T_VARIABLE' or `'$'' in hoge.php on line xxx」となり、
$hoge = preg_replace("/abc(.+?)def/i", "abd" . shori("$1") . "def", $hoge);
とすると「$1」が渡せません。
良い方法がありましたら教えて下さい。
よろしくお願いします。
>それとは話は別ですが、$1 は本当にまずいのでしょうか?
preg_XXX()関数は Perl互換正規表現用関数ですから、$1 を使っても問題ありません。
$1 を PHP に解釈させずに、preg_XXX()で解釈させるように注意する必要があるだけです。
従って
$html = preg_replace("/(男性|女性)/i", "<STRONG>$1</STRONG>", $html);
これは
$html = preg_replace("/(男性|女性)/i", '<STRONG>$1</STRONG>', $html);
// <STRONG>$1</STRONG> をシングルクォートで囲む
こうした方がベターでしょう。
ダブルクォートでうまく動いているのは、PHPのパーサーが馬鹿だからです。
それから、riafさんの2番の回答の補足ですが、
preg_replace("/abc(.+?)def/ie", '"abd" . shori("$1") . "def"', $hoge);
$1をダブルクォートで囲むかシングルクォートで囲むかで動作が変わりますので注意してください。
・ダブルクォートで囲んだ場合
(.+?)にマッチした文字列に $ などの記号が含まれていると、変数展開される。
・シングルクォートで囲んだ場合
変数展開されない。
riafさんの回答が間違いと言っているのではありません。
riafさんの回答は正しいのです。
ただし、プログラマーの意図として変数展開させたいのかどうかで、クォートを使い分ける必要があります。
その点誤解の無いようお願いします。
正規表現で指定したパラメータとは別ですので、そちらに$1を反映させることは無理でしょう。
泥臭いやり方ですが、事前に$hogeから、$1に相当する文字列を別変数に別途抜き出しておくしかないと思います。
回答2で動きました。
ありがとうございました。
e修飾子を設定してやって、
preg_replace("/abc(.+?)def/ie", '"abd" . shori("$1") . "def"', $hoge);
とかしてやれば、動くと思います。
ありがとうございました。
教えていただいた通りで無事動きました。
早朝から数時間悩んでいましたが助かりました。
ありがとうございました。
phpで$1ってつかえましたっけ?
確か$の後は数字駄目だったはずです
$1という変数をべつの変数に置き換える(ex.$value)と動くと思います
($1ってmod_rewiteとかで書いたものでしょうか?)
2の回答で無事動きました。
それとは話は別ですが、$1 は本当にまずいのでしょうか?
以前からかなりこれを使って実際に稼働させているサイトもかなりあるのでダメとなるとちょっとマズイです。
例えばこんな感じで問題なく動くのですが...
$html = preg_replace("/(男性|女性)/i", "$1", $html);
こういう使い方について問題があるようでしたら詳しく教えてください。
どなたでも構いません。
お願いします。
>それとは話は別ですが、$1 は本当にまずいのでしょうか?
preg_XXX()関数は Perl互換正規表現用関数ですから、$1 を使っても問題ありません。
$1 を PHP に解釈させずに、preg_XXX()で解釈させるように注意する必要があるだけです。
従って
$html = preg_replace("/(男性|女性)/i", "<STRONG>$1</STRONG>", $html);
これは
$html = preg_replace("/(男性|女性)/i", '<STRONG>$1</STRONG>', $html);
// <STRONG>$1</STRONG> をシングルクォートで囲む
こうした方がベターでしょう。
ダブルクォートでうまく動いているのは、PHPのパーサーが馬鹿だからです。
それから、riafさんの2番の回答の補足ですが、
preg_replace("/abc(.+?)def/ie", '"abd" . shori("$1") . "def"', $hoge);
$1をダブルクォートで囲むかシングルクォートで囲むかで動作が変わりますので注意してください。
・ダブルクォートで囲んだ場合
(.+?)にマッチした文字列に $ などの記号が含まれていると、変数展開される。
・シングルクォートで囲んだ場合
変数展開されない。
riafさんの回答が間違いと言っているのではありません。
riafさんの回答は正しいのです。
ただし、プログラマーの意図として変数展開させたいのかどうかで、クォートを使い分ける必要があります。
その点誤解の無いようお願いします。
ありがとうございました。
補足もとてもためになりました。
ありがとうございました。
補足もとてもためになりました。