Подтвердить что ты не робот

PHP regex: что такое "класс при смещении 0"?

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

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

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

$string = "I like: perl";    

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

Ответ 2

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

В дополнение к Gumbo answer, используйте модификатор 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.

Ответ 3

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

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

Ответ 4

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