1

次のコードがあります。

protected function safePath($path) {
        $path = (string) $path;

        $path = preg_replace(
            array(
            '#[\n\r\t\0]*#im',
            '#/(\.){1,}/#i',
            '#(\.){2,}#i',
            '#(\.){2,}#i',
            '#\('.DIRECTORY_SEPARATOR.'){2,}#i'
            ),
            array(
            '',
            '',
            '',
            '/'
            ),
            $path
            )
        ;
        return rtrim($path,DIRECTORY_SEPARATOR);
    }

パスを指定して関数を実行すると、次のエラーが発生します。

警告: preg_replace() [function.preg-replace]: コンパイルに失敗しました:行534の....../myfile.phpのオフセット 3 で括弧が一致しません

ここで、534 行目は次のようにマークされています。

protected function safePath($path) {
        $path = (string) $path;

        $path = preg_replace(
            array(
            '#[\n\r\t\0]*#im',
            '#/(\.){1,}/#i',
            '#(\.){2,}#i',
            '#(\.){2,}#i',
            '#\('.DIRECTORY_SEPARATOR.'){2,}#i'
            ),
            array(
            '',
            '',
            '',
            '/'
            ),   <---------------- THis is line 534
            $path
            )
        ;
        return rtrim($path,DIRECTORY_SEPARATOR);
    }

このエラーを修正する助けはありますか? ありがとうございました。

4

3 に答える 3

2

最後の正規表現では、開き括弧はエスケープしましたが、閉じ括弧はエスケープしませんでした

'#\('.DIRECTORY_SEPARATOR.'){2,}#i'

おそらく...

'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
                           ^
                           |
                       missing slash

...または、おそらくスラッシュはまったく存在しないはずです。いずれにせよ、一貫性がありません。

于 2009-10-27T17:02:24.280 に答える
1

これは、次の部分が原因です。

    '#\('.DIRECTORY_SEPARATOR.'){2,}#i'

Linuxシステムを使用していると思います。Windows では、DIRECTORY_SEPARATOR はバックスラッシュであり、その行の最初のバックスラッシュと一致します。

Linux では、DIRECTORY_SEPARATOR はスラッシュであるため、この文字列の先頭にはエスケープされた左角かっこがあり、最後には対応する角かっこがありません。

/その行のDIRECTORY_SEPARATORをaまたはaのいずれかに置き換えるだけで、どちらのタイプのOSでもエラーを再現できます\。結果はすぐにわかります。

于 2009-10-27T17:06:28.047 に答える
0

非常に奇妙なことに、両方のパラテシーがエスケープされている場合にのみ、そのエラーが発生します。

'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'

DIRECTORY_SEPARATOR をエスケープしていないためでしょうか?

'#\(\\'.DIRECTORY_SEPARATOR.'\){2,}#i'
于 2009-10-27T17:06:00.433 に答える