2012-05-08 11 views

答えて

0

あなたの表現が適切に引用されていない正規表現で特別な意味を持つ文字が含まれているので、それが正しく動作しません。

、100%確実である。このようpreg_quoteを使用するには:

$url = 'http://Example.com/' 
$pattern = preg_quote($url.'{word}/{word}/{word}', '/'); 
$pattern = str_replace($pattern, '{word}', '(\w+)'); 
$pattern = "/$pattern/i"; 
$replacement = $url.'$2/$3'; 
$appUrl= preg_replace($pattern, $replacement, $appUrl); 

それ以外の場合は、単に物事が間違って取得するには余りにも簡単です。たとえば、すべては現在.Example.comにエスケープしていないため、間違って表示されています。たとえば、次のような文字列を入力すると、これをテストできます。 http://Example!com!は任意の文字を使用できます)。

さらに、二重引用符で囲まれた文字列リテラルの中に$2などの文字列を使用しています。これは、IMHOは簡単に逃げるため、PHPではうまくありません。単なる引用して安全なものにしてください。

+0

あなたの答えをありがとう –

+0

'(\ w +)'の後に '/'をつけないでください - 引用符が多すぎますか?または私は何かを逃したことがありますか? – Adam

+0

@アダム:いいえ、私は請求として罪を犯しています。捕まえてくれてありがとう。そして、 'preg_quote'が面倒なことがあるのは事実です。しかし、石でキャストされていないリテラル(単にハードコーディングされているよりも強力な属性)では、そうでなければバグを導入するのは容易ではありません。 – Jon

3

パターン内のスラッシュをエスケープするか、別のパターンデリミタを使用する必要があります。

$pattern = '/http:\/\/Example\.com\/(\w+)\/(\w+)\/(\w+)/i';    

$pattern = '#http://Example\.com/(\w+)/(\w+)/(\w+)#i';    
+0

閉じるがシガーはありませんあなたが点を逃れるのを忘れたからです。これを手で行い、そのようなバグを導入(または保持)するリスクはありません:単に 'preg_quote'を使用してください。 – Jon

+0

@Jon合意、はい。私はドットのエスケープを修正しました(まだマッチしていますが)。個人的に、 'preg_quote'はコードをもう少し読めないようにしますが、私はあなたのことを知ります。 – Adam

+0

修正のために別の+1をお楽しみください。 – Jon

0
は次のようにスラッシュをエスケープ

$pattern = '/http:\/\/Example.com\/(\w+)\/(\w+)\/(\w+)/i';    
$replacement="http://Example.com/$2/$3"; 
$appUrl= preg_replace($pattern, $replacement, $appUrl); 
関連する問題