Ответ 1
preg_*
функции ожидают Perl-совместимые регулярные выражения с разделителями. Поэтому попробуйте следующее:
preg_replace('/[[:punct:]]/', ' ', $string)
Я пытаюсь удалить всю пунктуацию из строки с помощью простого регулярного выражения и функции php preg_replace, хотя я получаю следующую ошибку:
Ошибка компиляции: классы с именем POSIX поддерживаются только внутри класса со смещением 0
Я предполагаю, что это означает, что я не могу использовать классы с именем POSIX за пределами класса со смещением 0. Мой вопрос: что это значит, когда он говорит "внутри класса со смещением 0"?
$string = "I like: perl";
if (eregi('[[:punct:]]', $string))
$new = preg_replace('[[:punct:]]', ' ', $string); echo $new;
preg_*
функции ожидают Perl-совместимые регулярные выражения с разделителями. Поэтому попробуйте следующее:
preg_replace('/[[:punct:]]/', ' ', $string)
ПРИМЕЧАНИЕ. Модификатор 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.
Объяснение того, почему вы получаете эту ошибку: PCRE использует Perl для определения того, что такое разделитель. Ваш внешний []
выглядит как допустимые разделители, заставляя его читать [:punct:]
как часть регулярного выражения.
(О, и избегайте функций ereg
, если можете - они не будут включены в PHP 5.3.)
Я только что добавил g в regexp, как было предложено в одном из андерверов, он сделал противоположное ожидаемым wahts и НЕ отфильтровывал пунктуацию, оказывается, preg_replace не требует g, поскольку он является глобальным/рекурсивным в первую очередь