PHP preg_replace error - PullRequest
       2

PHP preg_replace error

0 голосов
/ 27 октября 2009

У меня есть следующий код:

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]: Ошибка компиляции: несоответствующие скобки со смещением 3 в ...... / myfile.php в строке 534

где строка 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);
    }

Любая помощь с исправлением этой ошибки? Спасибо.

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

в последнем регулярном выражении вы избежали открывающей скобки, но не закрывающей

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

возможно, должно быть ...

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

... или, возможно, косой черты вообще не должно быть. В любом случае, это противоречиво.

1 голос
/ 27 октября 2009

Это из-за этой части прямо здесь:

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

Полагаю, вы работаете в системе Linux. В Windows DIRECTORY_SEPARATOR - это обратная косая черта, которая совпадает с начальной обратной косой чертой в этой строке.

В linux DIRECTORY_SEPARATOR - это косая черта, поэтому в начале этой строки стоит экранированная левая скобка, а в конце нет соответствующей.

Вы можете воспроизвести ошибку на любом типе ОС, просто заменив DIRECTORY_SEPARATOR в этой строке на / или \. Вы увидите результат сразу.

0 голосов
/ 27 октября 2009

Как ни странно, я могу получить эту ошибку только в том случае, если сбегут оба участника:

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

Может быть, потому что вы не избегаете DIRECTORY_SEPARATOR?

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