5

正規表現で予約された文字をバックスラッシュでエスケープしようとしています(質問しないでください。HTMLを解析しようとしていないと言えば十分です:))そして奇妙なことが起こっています。

$regex_chars = array('[' , '\\' , '^', '$' , '.' , '|' , 
    '?' , '*' , '+' , '(' , ')');  
$regex_chars_escaped = array('\[ ' , '\\\\ ' , '\^ ', '\& ' , 
    '\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)'); 
$escaped_string = str_replace($regex_chars,$regex_chars_escaped,
     implode("",$regex_chars));
echo implode('&nbsp;',$regex_chars) . "<br />";
echo $escaped_string;

スペースはわかりやすくするためのものです。これが出力です

[ \ ^ $ . | ? * + ( )
\\ [ \\ \^ \& \. \| \? \* \+ \( \)

したがって、最初の部分を除いて、すべてが良好です。「\\」はどこから来たのですか、なぜ「\ [」ではないのですか?

4

2 に答える 2

22

単純にpreg_quoteを使用しないのはなぜですか?

于 2009-11-24T11:12:42.847 に答える
2

文字を配列に入れる順序が原因だと思います。これを試して:

$regex_chars = array('\\' , '[' , '^', '$' , '.' , '|' , 
        '?' , '*' , '+' , '(' , ')');  
$regex_chars_escaped = array( '\\\\ ' ,'\[ ', '\^ ', '\& ' , 
        '\. ' , '\| ' , '\? ' , '\* ' , '\+ ' , '\( ' , '\)'); 

そして、期待される出力が得られるはずです。str_replace 関数仕様の「潜在的な落とし穴」セクションを確認してください

于 2009-11-24T11:29:38.377 に答える