$row_cntと$1の違いと数字の参照方法について

このQ&Aのポイント
  • プログラム初心者が文字を参照する方法について質問です。$row_cntと$1の違いが理解できませんでした。また、数字を参照する方法についても教えてください。
  • preg_replace関数の使用時に、$row_cntと$1の違いが気になりました。$row_cntは投稿したレス番号を参照するために使われるようですが、$1は文字の参照になるようです。数字の参照方法についても教えてください。
  • プログラム初心者が質問です。$row_cntと$1の違いがわかりませんでした。また、数字を参照する方法についても教えてください。使い方を教えていただけると助かります。
回答を見る
  • ベストアンサー

置換え

プログラム初心者です 文字を参照でつかおうとおもったんですがつかえませんでした $row_cntは投稿したレス番号です レス番号と引用した数字が同じ場合は置換えないようにしようとおもいました $noに入っている文字がなにか確認したら参照した数字ではなくて文字の$1になってました。 どうやったら参照した数字を変数にいれられるでしょうか? $pattern="/&gt;&gt;(\d+)/"; $no= "$1"; if($row_cnt!=$no){ $replacement="<a href=\"bbs.php?no=$1\">$0</a>"; $str=preg_replace($pattern,$replacement,$mes); } よろしくおねがいします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.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>"; ?>

flash0
質問者

お礼

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

その他の回答 (1)

noname#244856
noname#244856
回答No.1

落ち着いて整理してください。 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 ); とするのが一番賢いかもしれません。

flash0
質問者

お礼

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

関連するQ&A

  • HTMLの許可

    プログラム初心者です 簡単な掲示板を作りました 一部のHTMLのタグを許可する方法を教えてください 素人なりに考えたのですが、一回タグをすべて無効化して&lt;code&gt;にしてから許可したいタグにマッチした文字だけをHTMLにすればどうかなと思ったんです 質問1 これで、セキュリティ的に安全ですか? 質問2 10個くらいのタグを置き換えると負荷は重そうですか?メッセは最大2000文字程度です <?PHP $mes//投稿されたメッセ(タグは除去済み) $pattern="/&lt;code&gt;/"; $replacement="<code>"; preg_replace($pattern,$replacement,$mes); $pattern="/&lt;/code&gt;/"; $replacement="</code>"; preg_replace($pattern,$replacement,$mes); ?> 許可したいタグは、b、code、tableなどのタグなどです 質問3 もっと他にいい方法があればお願いします よろしくお願いします

    • ベストアンサー
    • PHP
  • 画像の置換え

    プログラム初心者です 番号と画像拡張子を簡単な正規表現で表す方法をおしえてください 拡張子はgif、png、jpgの拡張子です 番号は桁数も番号も変わります。この三パターンにマッチするテキストを置き換えたいです 例 56.gif 100.gif 6.png 6549.png 79169.jpg 35.jpg $pattern="/(\d+)/"; $replacement="<a href=\"$0\">$0</a>"; if(preg_match($pattern,$mes,$matches) ){ $mes=preg_replace($pattern,$replacement,$mes); } よろしくお願いします

    • ベストアンサー
    • PHP
  • PHPのpreg_replaceについて

    文字列に半角、全角があったら''に置換したいです。 例)あ あ あ -> あああ 上記のように。 ソースは下記のとおりしてみたのですがうまく表示されませんでした。 $string = 'あ あ あ'; $pattern = '[ \t\n\r\f]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); 他には $string = 'あ あ あ'; $pattern = '[[:space:]]'; $replacement = ''; $var_dump(preg_replace($pattern,$replacement, $string)); などと行ってみました。 ご教授お願いいたします。

    • 締切済み
    • PHP
  • preg_replace()でマッチ文字列に関数を

    PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。

    • ベストアンサー
    • PHP
  • htmlタグを削除させて表示させたい

    特定の変数内にある、htmlタグを削除させて表示させたいのですが、reg_replace()を使うのが妥当でしょうか? その際、<br>や<img ="http=~">といった< >内が変化する文字を指定するのがわからなくて困っています。 <?php $string = 'こんにちは、<br>皆さん.'; $pattern = '/<br>/'; $replacement = ''; echo preg_replace($pattern, $replacement, $string); ?> この</br/>の部分を</*/>としてみましたが見当違いのようで"皆さん"の部分がすっぽ抜けてしまいました。 もしご存知の方おられましたら、どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • preg_replaceについて

    $text = "今日財布を拾った。"; $value = "100円"; $pattern = "/(今日).*(を拾った。)/"; $replace = sprintf("\\1%s\\2"); $text = preg_replace($pattern, $replace, $text); のような処理を行ったとき、 うまく$textに結果が格納されません。 $valueの最初の文字が数字で無い場合は うまくいきますが、"100円"のように数字で 始まっていると、うまくいきません。 良い回避方法は無いでしょうか?

    • ベストアンサー
    • PHP
  • 正規表現について教えて下さい

    正規表現について教えて下さい $string = "LibrayMyUtil2File AppFile"; $pattern = '/([A-Z][a-z0-9]*)*([A-Z][a-z0-9]*)File/'; $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 App と表示される この例のように、「File」の前の単語に置き換えたいのですが、 このやり方だとpatternの「[A-Z][a-z0-9]*」が重複しているのが凡長だと思ってまして もっと短縮された書き方があれば教えてもらいたいです。

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • preg_replaceでの警告

    PHP5.2.4を使用しています。 CakePHPというフレームワークの中の関数で、次のような Warning (2): preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 6 という警告がでるのですが、preg_replace関数の第4引数を指定してないからなのかな?と思い、 1という数字を指定してみたりしたのですが、同じような警告が出てしまいます・・・ たぶんバージョン間の違いだと思いますが、 この場合は、たとえば警告を出さないフラグを変更する以外に preg_replace関数をどのように記述すれば良いのでしょうか? function slug($string, $replacement = '_') { if(!class_exists('String')) { require_once LIBS . 'string.php'; } $map = array( '/a|a|a|a/' => 'a', '/e|e|e|?|e/' => 'e', '/i|i|i/' => 'i', '/o|o|o|o/' => 'o', '/u|u|?|u/' => 'u', '/c/' => 'c', '/n/' => 'n', '/a|a/' => 'ae', '/o/' => 'oe', '/u/' => 'ue', '/A/' => 'Ae', '/U/' => 'Ue', '/O/' => 'Oe', '/s/' => 'ss', '/[^\w\s]/' => ' ', '/\\s+/' => $replacement, String::insert('/^[:replacement]+|[:replacement]+$/', array('replacement' => preg_quote($replacement, '/'))) => '', ); /* print "string=$string<br>\n"; print_r(array_keys($map)); print_r(array_values($map)); */ $string = preg_replace(array_keys($map), array_values($map), $string); return $string; } string=test<br> Array ( [0] => /a|a|a|a/ [1] => /e|e|e|?|e/ [2] => /i|i|i/ [3] => /o|o|o|o/ [4] => /u|u|?|u/ [5] => /c/ [6] => /n/ [7] => /a|a/ [8] => /o/ [9] => /u/ [10] => /A/ [11] => /U/ [12] => /O/ [13] => /s/ [14] => /[^\w\s]/ [15] => /\s+/ [16] => /^[_]+|[_]+$/ ) Array ( [0] => a [1] => e [2] => i [3] => o [4] => u [5] => c [6] => n [7] => ae [8] => oe [9] => ue [10] => Ae [11] => Ue [12] => Oe [13] => ss [14] => [15] => _ [16] => )

    • 締切済み
    • PHP
  • 文字列の否定の正規表現

    文字列の否定の正規表現 次のような「File」の前の文字列を大文字に置き換えるという文で 「common」という文字列だけはそのまま置き換えないようにしたいのですが、 $string = "commonFile aaFile"; $pattern = '/(\w+)(?![common])(File)/e'; $replacement="ucwords('\\1')"; $string = preg_replace($pattern, $replacement, $string); print htmlspecialchars($string); //Common Aa と表示される このやり方だと「\w+」が効いてるせいなのか先読み否定の「?![common]」が効いてくれません・・・ $pattern = '/(aa)(?![common])(File)/e'; print htmlspecialchars($string); //commonFile Aa と理想とする結果が表示される と具体的な文字列だと要求どおりになるのですが、 そうではなくて「File」の前が「common」の時だけ無視して欲しいのです。 どのように記述すれば良いのでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう