人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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」が渡せません。

良い方法がありましたら教えて下さい。
よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:ABC def hoge ON PHP
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● tadashi0805
●10ポイント

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

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

◎質問者からの返答

回答2で動きました。

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


2 ● riaf
●30ポイント

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

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

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

http://jp2.php.net/preg_replace

◎質問者からの返答

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

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

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

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


3 ● わんきち
●10ポイント

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

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

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

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

◎質問者からの返答

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

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

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

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

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

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

どなたでも構いません。

お願いします。


4 ● tombe
●40ポイント ベストアンサー

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

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

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ