電子書籍の厳選無料作品が豊富!

プログラム初心者です

文字を参照でつかおうとおもったんですがつかえませんでした
$row_cntは投稿したレス番号です
レス番号と引用した数字が同じ場合は置換えないようにしようとおもいました
$noに入っている文字がなにか確認したら参照した数字ではなくて文字の$1になってました。
どうやったら参照した数字を変数にいれられるでしょうか?


$pattern="/>>(\d+)/";
$no= "$1";
if($row_cnt!=$no){
$replacement="<a href=\"bbs.php?no=$1\">$0</a>";
$str=preg_replace($pattern,$replacement,$mes);
}

よろしくおねがいします

A 回答 (2件)

考え方としては


まずマッチするかどうかしらべる
マッチするならマッチした数値と与える数値が合致するか調べる
という処理をすればよいでしょう

具体的には
<?PHP
$pattern="/&gt;&gt;(\d+)/";
$replacement="<a href=\"bbs.php?no=$1\">$0</a>";

$mes="test&gt;&gt;123test";
$row_cnt="123";
if(preg_match($pattern,$mes,$matches) and $matches[1]===$row_cnt){
$mes=preg_replace($pattern,$replacement,$mes);
}
print $mes."<br>";

?>
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございます
提示されたコードを少し変更したらうまくいきました。

お礼日時:2013/10/30 17:47

落ち着いて整理してください。



PHPのプログラムは基本的に上から順番に実行されます。
これは自明ですよね。

$pattern = "/&gt;&gt;(\d+)/";

まず $pattern に「/&gt;&gt;(\d+)/」が代入されますね。
これはただの文字列です。

$no = "$1";

"$var" とした場合は変数展開されますが、 "$1" のように
数字で始まるものは変数として認識されず、そのまま文字列
となります。よって $no に「$1」が代入されます。

これは当然の挙動ですね。
"$var" であったとしても単に変数 $var の内容が展開されるだけで、
ただの文字列になるだけです。

さて、preg_replace と何の関係も無いことに気づきませんか?
$1, $2 で参照したりできるのは preg_replace の第2引数の中だけです。
これはPHPの言語としての機能ではなく、
preg_replace 関数が独自に実装しているだけです。

本題に戻りますが、重複するレス番号を避けたいならば

$str = preg_replace_callback(
 '/&gt;&gt;(\d++)/',
 function ($m) use ($row_cnt) {
  return $m[1] != $row_cnt ?
   sprintf('<a href="bbs.php?no=%d">%s</a>',
    $m[1],
    $m[0]
   ) :
   $m[0]
  ;
 },
 $str
);

とするのが一番賢いかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
preg_replaceの中でしか参照できないんですね。勘違いしていました
設置の仕方がわからずsyntax errorが出てしまいました。すいません

お礼日時:2013/10/30 17:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!