2010-11-25 9 views
1
<?php 
    function pregForPreg($value) 
    { 
     $value = preg_replace(array('#\(#', '#\)#', '#\+#', '#\?#', '#\*#', '#\##', '#\[#', '#\]#', '#\&#', '#\/#', '#\$#', '#\\\\#'), array('\(', '\)', '\+', '\?', '\*', '\#', '\[', '\]', '\&', '\/', '\\\$', '\\\\'), $value); 
     return $value; 
    } 

    $var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]"; 

    $var = pregForPreg($var); 
    //$var is now: 
    // TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\] 
    $var = preg_replace("#" . $var . "#isU", 'test', $var); 
    echo $var; 

そして、私はエラーを取得する:*警告:にpreg_replace():コンパイルに失敗しました:PCREは、\ Lをサポートしていない、\リットル、\ N、\ U、またはuを\は、で50をオフセットtest.php on line 13. *PHP PCREエラーにpreg_replace

正しい機能を作る方法pregForPreg?

答えて

5

特殊正規表現の文字をエスケープしたいようです。この関数は既に存在し、preg_quote()と呼ばれています。


あなたが適切\をエスケープしていないので、あなたは、エラーが発生します。

TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\] 
//     this is not escaped ------^ 

\L Perlの正規表現で特別な意味があります。

\L Lowercase until \E

をしかしではサポートされていませんPHPのPCRE(Perl Differences):

The following Perl escape sequences are not supported: \l, \u, \L, \U . In fact these are implemented by Perl's general string-handling and are not part of its pattern matching engine.

アップデート:パターンで\[[として扱われ、その値\[に文字通りに解釈されているため、明らかに

は、あなたが、値として及びパターンとしてエスケープバージョンを使用することはできません。あなたは新しい変数でエスケープされた文字列を保存する必要があります。

$var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]"; 

$escaped = preg_quote($var); 
echo $escaped . PHP_EOL; 
// prints "TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\\LYRICS\]" 
$var = preg_replace('#' . $escaped . '#isU', 'test', $var); 
echo $var; 
// prints test 

か簡単に:

$var = preg_replace('#' . preg_quote($var) . '#isU', 'test', $var); 

サイドノート:あなたが本当に文字列で\[にマッチしたい場合は、正規表現は\\\\\[だろう。あなたは、それがかなり醜くなることがわかります。

+0

私の文字列はpreg_quoteに置き換えられません。 – Isis

+0

いいえ、その時点ですでに文字列にある\の前に別の\を追加することで、\ preg_quoteに手動でエスケープする必要があります。 – Arantor

+2

@Isis:あなたが何を意味するか分かりません。 'pregForPreg'の代わりに' preg_quote'を使うべきです。そしてあなたは実際に達成したいものを指定していません... –