Php заменяет символы, соответствующие регулярному выражению

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

"Предупреждение: preg_replace(): не найден конечный разделитель '_'"

$oldString = "";
$newString = preg_replace("/[^a-z0-9_]/ig", "", $oldString);

Здесь я пытаюсь удалить все символы, кроме букв, цифр и подчеркивания.


person user703555    schedule 10.12.2011    source источник


Ответы (4)


g не поддерживается в PHP, достаточно удалить модификатор g (глобальный).
Вот список поддерживаемых модификаторов

person ajreal    schedule 10.12.2011

Я думаю, что php не нравится контрольный символ g после вашего трейлинга /. У меня тоже были проблемы с этим, и удаление g, кажется, помогает. preg_replace имеет необязательные параметры, которые он принимает после строки, которую вы хотите увеличить, где вы управляете количеством раз, которым вы хотите ограничить поиск, по умолчанию он глобальный.

В руководстве сказано, что вы устанавливаете ограничение с помощью 4-го параметра (limit ), и если вы хотите, вы можете передать 5-й параметр count, который даст вам количество раз, когда он нашел совпадение.

На мой взгляд, это еще одна вещь, которую PHP делает на 1/2 правильно, что в сумме дает ему примерно 1/2 идеального языка. Но это ни туда ни сюда :)

О, и добро пожаловать в Стек! :)

person Yevgeny Simkin    schedule 10.12.2011
comment
Я думаю, что проблема в g. В любом случае, [^a-z0-9_] с нечувствительным флагом — это то же самое, что [^A-Za-z0-9_] без него. - person Brigand; 10.12.2011

Во-первых, нет модификатора g для preg_replace.

$oldString = "";
$newString = preg_replace("/[^a-z0-9_]*/i", "", $oldString);

Во-вторых, попробуйте поставить множитель после класса вашего персонажа, чтобы заменить более 1 символа.

person Tudor Constantin    schedule 10.12.2011

В RegEx \W означает любые символы, отличные от буквенно-цифровых символов подчеркивания. Имейте в виду, что это также заменит пробелы.

$oldString = "This, is not _all_ alpha-numeric";
$newString = preg_replace("/\W+/", "", $oldString);
# Gives "Thisisnot_all_alphanumeric"

$newString = preg_replace("/[^\w ]+/", "", $oldString);
# Gives "This is not _all_ alphanumeric"
person Brigand    schedule 10.12.2011