2

わかりました、この問題は私の頭のはるか上にあるようです!

私はこのコードを持っています:

$request=preg_replace('$(^'.str_replace('$','\$',$webRoot).')$i','',$requestUri);

これは私にエラーをスローします:

preg_replace(): 終了区切り文字 '$' が見つかりません

しかし、ここにあるのは、終わりの区切りが確かにあるということです。

その関数呼び出しの後、次のようにエコーアウトしました。

echo $webRoot;
echo $requestUri;
echo '$(^'.str_replace('$','\$',$webRoot).')$i';

これは、これらのエコーの結果です。

/
/en/example/
$(^/)$i

面白いのは、これを直接行うと次のようになることです。

preg_replace('$(^/)$i','',$requestUri);

..できます。しかし、これも失敗します:

$tmp=str_replace('$','\$',$webRoot);
preg_replace('$(^'.$tmp.')$i','',$requestUri);

徹底的にするために、 echo $tmp が与えるものもテストしましたが、適切な値が得られます。

/

WindowsのPHPのバグですか?Linux サーバーで試してみたところ、期待どおりに動作し、このエラーは発生しませんでした。または、何か不足していますか?

念のため、PHP を最新の Windows バージョン (5.4.2) に更新したところ、同じことが起こりました。

4

2 に答える 2

2

$ char は、正規表現パターンが適用される文字列の末尾に一致する正規表現の特殊文字であるため、個人的には「#」などの区切り文字として別​​の文字を使用します。とはいえ、Windowsサーバーで作業しなければならなかった数回は、すべての正規表現をpreg_quote関数を介して渡す必要があることがわかりました。正規表現の特殊文字が含まれているかどうかは気にしません。

$request=preg_replace('#(^'.preg_quote($webRoot).')#i','',$requestUri);
于 2012-05-08T16:53:40.293 に答える
0

abidibo の答えは正しいのですが、問題は str_replace() 関数のバグが原因だったようです。何らかの理由で、Windows Apache および nginx では、この関数によって文字列が破損し、読み取れない記号が埋め込まれます。

于 2012-05-08T17:22:54.037 に答える