PHP - заменить все небуквенно-цифровые символы для всех поддерживаемых языков

Привет, я на самом деле пытаюсь заменить все НЕ буквенно-цифровые символы из такой строки:

mb_ereg_replace('/[^a-z0-9\s]+/i','-',$string);

первая проблема заключается в том, что он не заменяет символы, такие как ".", из строки.

Во-вторых, я хотел бы добавить в этот метод многобитную поддержку для всех языков пользователей.

Как я могу это сделать?

Любая помощь приветствуется, большое спасибо.


person itsme    schedule 14.06.2013    source источник
comment
Просто добавьте период в список персонажей. ^а-z0-9\с. --- Что касается добавления поддержки многобайтности, если вы имеете в виду замену акцентов и тому подобное, я не знаю другого метода, кроме как создать огромный массив с такими вещами, как é => e, и использовать его для strtr.   -  person Ariane    schedule 14.06.2013
comment
@ Ариана, все в порядке? я имею в виду, что у меня уже есть период!? нет не имеет значения для акцентированных ;)   -  person itsme    schedule 14.06.2013


Ответы (4)


Попробуйте следующее:

preg_replace('/[^\p{L}0-9\s]+/u', '-', $string);

Когда в регулярном выражении используется флаг u, \p{L}\p{Letter}) соответствует любому символу в любой из буквенных категорий Unicode.

person Andrew Clark    schedule 14.06.2013
comment
о боже, чувак, я использовал mb_ereg_replace(), извини, я обновил вопрос @F.J - person itsme; 14.06.2013
comment
Должен ли я вместо этого использовать preg_replace()? :П - person itsme; 14.06.2013
comment
Извините, я мало что знаю о mb_ereg_replace(), но preg_replace() должно работать, так что переключение определенно возможно. - person Andrew Clark; 15.06.2013

Он должен заменить . на -, вы, вероятно, в первую очередь смешиваете свои данные.

Что касается поддержки нескольких байтов, добавьте модификатор u и загляните в свойства PCRE, а именно \p{Letter}:

$replaced = preg_replace('~[^0-9\p{Letter}]+~iu', '-', $string);
person Alix Axel    schedule 14.06.2013
comment
о боже, чувак, я использовал mb_ereg_replace(), извини, я обновил вопрос @Alix Axel - person itsme; 14.06.2013
comment
@badbetonbreakbutbedbackbone: Perl-совместимые регулярные выражения (preg) более эффективны, чем расширенные регулярные выражения (ereg). - person Alix Axel; 15.06.2013

Самый короткий путь:

$result = preg_replace('~\P{Xan}++~u', '-', $string);

\p{Xan} содержит цифры и буквы на всех языках, поэтому \P{Xan} содержит все, что не является буквой или цифрой.

person Casimir et Hippolyte    schedule 14.06.2013
comment
спасибо, а как насчет mb_ereg_replace(), не лучше ли? можете ли вы сказать мне, нужно ли мне переключиться на preg_replace() и почему? :П - person itsme; 15.06.2013
comment
@badbetonbreakbutbedbackbone: Нет. Модификатор u в конце означает, что шаблон может работать с юникодом с функциями preg_*. ИМХО, функции mb_ereg исчезнут. Функции preg_* работают быстрее и поддерживают юникод. - person Casimir et Hippolyte; 15.06.2013

Это выражение заменяет точки. Для мультибайта используйте модификатор u (UTF-8).

person Ziarno    schedule 14.06.2013
comment
о боже, чувак, я использовал mb_ereg_replace(), извини, я обновил вопрос @Ziarno - person itsme; 14.06.2013