phpについてですが下記のようなことはできないのでしょうか?

「一致した部分に処理をしてから置き換えがしたい」

$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人2回まで
  • 登録:2006/06/11 08:56:35
  • 終了:2006/06/11 15:57:58

ベストアンサー

id:tombe No.4

tombe回答回数38ベストアンサー獲得回数72006/06/11 14:50:50

ポイント40pt

>それとは話は別ですが、$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さんの回答は正しいのです。

ただし、プログラマーの意図として変数展開させたいのかどうかで、クォートを使い分ける必要があります。

その点誤解の無いようお願いします。

id:worldtravel

ありがとうございました。

補足もとてもためになりました。

2006/06/11 15:56:26

その他の回答(3件)

id:tadashi0805 No.1

tadashi0805回答回数287ベストアンサー獲得回数292006/06/11 09:58:00

ポイント10pt

正規表現で指定したパラメータとは別ですので、そちらに$1を反映させることは無理でしょう。

泥臭いやり方ですが、事前に$hogeから、$1に相当する文字列を別変数に別途抜き出しておくしかないと思います。

id:worldtravel

回答2で動きました。

ありがとうございました。

2006/06/11 10:57:24
id:riaf No.2

riaf回答回数13ベストアンサー獲得回数02006/06/11 10:00:11

ポイント30pt

e修飾子を設定してやって、

preg_replace("/abc(.+?)def/ie", '"abd" . shori("$1") . "def"', $hoge);

とかしてやれば、動くと思います。

http://jp2.php.net/preg_replace

id:worldtravel

ありがとうございました。

教えていただいた通りで無事動きました。

早朝から数時間悩んでいましたが助かりました。

ありがとうございました。

2006/06/11 10:57:00
id:wang-zhi No.3

わんきち回答回数13ベストアンサー獲得回数12006/06/11 10:04:45

ポイント10pt

phpで$1ってつかえましたっけ?

確か$の後は数字駄目だったはずです

$1という変数をべつの変数に置き換える(ex.$value)と動くと思います

($1ってmod_rewiteとかで書いたものでしょうか?)

id:worldtravel

2の回答で無事動きました。

それとは話は別ですが、$1 は本当にまずいのでしょうか?

以前からかなりこれを使って実際に稼働させているサイトもかなりあるのでダメとなるとちょっとマズイです。

例えばこんな感じで問題なく動くのですが...

$html = preg_replace("/(男性|女性)/i", "$1", $html);

こういう使い方について問題があるようでしたら詳しく教えてください。

どなたでも構いません。

お願いします。

2006/06/11 11:01:25
id:tombe No.4

tombe回答回数38ベストアンサー獲得回数72006/06/11 14:50:50ここでベストアンサー

ポイント40pt

>それとは話は別ですが、$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さんの回答は正しいのです。

ただし、プログラマーの意図として変数展開させたいのかどうかで、クォートを使い分ける必要があります。

その点誤解の無いようお願いします。

id:worldtravel

ありがとうございました。

補足もとてもためになりました。

2006/06/11 15:56:26

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません