preg_replace

で手間取ったのでメモです。

perlで

if($printmes =~ /q=([\w%]+)/){$printmes = "$1";}
elsif($printmes =~ /p=([\w%]+)/){$printmes = "$1";}
else{$printmes = "";}

と書いていたプログラムをphpで書き直したかったんですが、
2時間程書き直しに手間取ってしまいました。
正規表現を使った後方参照がうまくいかなかったのです。

結果的には、

if(preg_match("/q=[\w%+-]+/",$ref)){
$moji = preg_replace("/.*[&?]q=([\w%+-]+?)&.*/","$1", $ref);
}elseif(preg_match("/p=[\w%+-]+/",$ref)){
$moji = preg_replace("/.*[&?]p=([\w%+-]+?)&.*/","$1", $ref);
}else{
$moji = "";
}

ということで落ち着きました。

preg_replaceでの後方参照で一部だけを抜き出したい場合は、通常

$kekka = preg_replace("/.*henkan_pattern(.*?)henkan_pattern.*/","$1",$inyou_moto);

のようにしましょう。そうすると、(.*?)の部分が$kekkaに入ります。

【重要】

パターンと後方参照の部分に「"」で囲むことを忘れると正常に動きません。