- ベストアンサー
$row_cntと$1の違いと数字の参照方法について
- プログラム初心者が文字を参照する方法について質問です。$row_cntと$1の違いが理解できませんでした。また、数字を参照する方法についても教えてください。
- preg_replace関数の使用時に、$row_cntと$1の違いが気になりました。$row_cntは投稿したレス番号を参照するために使われるようですが、$1は文字の参照になるようです。数字の参照方法についても教えてください。
- プログラム初心者が質問です。$row_cntと$1の違いがわかりませんでした。また、数字を参照する方法についても教えてください。使い方を教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
考え方としては まずマッチするかどうかしらべる マッチするならマッチした数値と与える数値が合致するか調べる という処理をすればよいでしょう 具体的には <?PHP $pattern="/>>(\d+)/"; $replacement="<a href=\"bbs.php?no=$1\">$0</a>"; $mes="test>>123test"; $row_cnt="123"; if(preg_match($pattern,$mes,$matches) and $matches[1]===$row_cnt){ $mes=preg_replace($pattern,$replacement,$mes); } print $mes."<br>"; ?>
その他の回答 (1)
落ち着いて整理してください。 PHPのプログラムは基本的に上から順番に実行されます。 これは自明ですよね。 $pattern = "/>>(\d+)/"; まず $pattern に「/>>(\d+)/」が代入されますね。 これはただの文字列です。 $no = "$1"; "$var" とした場合は変数展開されますが、 "$1" のように 数字で始まるものは変数として認識されず、そのまま文字列 となります。よって $no に「$1」が代入されます。 これは当然の挙動ですね。 "$var" であったとしても単に変数 $var の内容が展開されるだけで、 ただの文字列になるだけです。 さて、preg_replace と何の関係も無いことに気づきませんか? $1, $2 で参照したりできるのは preg_replace の第2引数の中だけです。 これはPHPの言語としての機能ではなく、 preg_replace 関数が独自に実装しているだけです。 本題に戻りますが、重複するレス番号を避けたいならば $str = preg_replace_callback( '/>>(\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 ); とするのが一番賢いかもしれません。
お礼
回答ありがとうございます preg_replaceの中でしか参照できないんですね。勘違いしていました 設置の仕方がわからずsyntax errorが出てしまいました。すいません
お礼
わかりやすい回答ありがとうございます 提示されたコードを少し変更したらうまくいきました。