13

うーん...preg_replaceの呼び出しで変数を使用するにはどうすればよいですか?

これは機能しませんでした:

foreach($numarray as $num => $text)
    {
        $patterns[] = '/<ces>(.*?)\+$num(.*?)<\/ces>/';
        $replacements[] = '<ces>$1<$text/>$2</ces>';
    }

はい、前に$numプラス記号が付いています。はい、「」したいですtag the $num as <$text/>

4

2 に答える 2

15

置換パターンは問題ないように見えますが、一致するパターンで一重引用符を使用しているため、$num変数はそれに挿入されません。代わりに、

$patterns[] = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';

また、このような「不明な」入力からパターンを構築する場合は、通常、preg_quoteを使用することをお勧めします。例えば

$patterns[] = '/<ces>(.*?)\+'.preg_quote($num).'(.*?)<\/ces>/';

変数名を指定すると思いますが、あなたの場合は常に数値です。

于 2009-09-09T16:45:27.210 に答える
14

変数は、二重引用符で宣言された文字列でのみ展開されます。したがって、二重引用符を使用します。

$patterns[]     = "/<ces>(.*?)\\+$num(.*?)<\\/ces>/";
$replacements[] = "<ces>$1<$text/>$2</ces>";

または、文字列連結を使用します。

$patterns[]     = '/<ces>(.*?)\+'.$num.'(.*?)<\/ces>/';
$replacements[] = '<ces>$1<'.$text.'/>$2</ces>';

preg_quote変数に正規表現のメタ文字が含まれているかどうかも確認する必要があります。

于 2009-09-09T16:44:30.053 に答える