PHP регулярное выражение: что такое "класс со смещением 0"? - PullRequest
27 голосов
/ 24 января 2009

Я пытаюсь удалить все знаки препинания из строки, используя простое регулярное выражение и функцию php preg_replace, хотя я получаю следующую ошибку:

Ошибка компиляции: именованные классы POSIX поддерживаются только внутри класса со смещением 0

Полагаю, это означает, что я не могу использовать именованные классы POSIX вне класса со смещением 0. Мой вопрос: что это значит, когда он говорит "внутри класса со смещением 0"?

$string = "I like: perl";    

if (eregi('[[:punct:]]', $string))  
    $new = preg_replace('[[:punct:]]', ' ', $string); echo $new;

Ответы [ 4 ]

44 голосов
/ 24 января 2009

Функции preg_* ожидают Регулярные выражения, совместимые с Perl с разделителями. Итак, попробуйте это:

preg_replace('/[[:punct:]]/', ' ', $string)
5 голосов
/ 24 января 2009

ПРИМЕЧАНИЕ. Модификатор g не требуется при реализации PHP PCRE!

В дополнение к ответу Гамбо используйте модификатор g для замены всех вхождений в пунктуации:

preg_replace('/[[:punct:]]/g', ' ', $string)
//                         ^

С Джонатан Лоновски (см. Комментарии):

> [The g modifier] means "Global" -- i.e., find all existing matches. Without it, regex functions will stop searching after the first match.
1 голос
/ 24 января 2009

Объяснение почему вы получаете такую ​​ошибку: PCRE использует свободное определение Perl того, что такое разделитель. Ваши внешние [] выглядят как допустимые разделители, в результате чего он читается как [:punct:] как часть регулярного выражения.

(Да, и избегайте функций ereg, если можете - они не будут включены в PHP 5.3.)

0 голосов
/ 24 января 2009

Я просто добавил g к регулярному выражению, как было предложено в одном из ответов, он сделал противоположное ожидаемым вахт, и не отфильтровывал пунктуацию, оказалось, что preg_replace не требует g, поскольку он глобален / рекурсивен в первую очередь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...