Я пытаюсь удалить всю пунктуацию из строки с помощью простого регулярного выражения и функции 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 , используйте модификатор g
, чтобы заменить все признаки пунктуации:
preg_replace('/[[:punct:]]/g', ' ', $string) // ^
От Джонатана Лоновского (см. Комментарии):
> [The g modifier] means "Global" -- ie, 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, поскольку он является глобальным / рекурсивным в первую очередь