Убрать все символы, кроме латиницы, кириллицы и запятой - PHP

Sarkis Allahverdian

подскажите регулярку, которая должна вырезать любые символы, кроме запятой (оставаться должны только кириллица и латинница). Сделал наброски , вроде работают , но запятую не знаю как оставить.

$key_words=mb_strtolower($key_words);
$key_words=preg_replace("/[^a-zа-я\s]/iu","",$key_words);
2 ответа

Sarkis Allahverdian

Если должны остаться только буквы (кириллица + латиница) и запятая, то код должен иметь вид:

preg_replace("/[^а-яёa-z,]/iu", '', $target);

UPD:

Стоит обратить внимание, что регулярное выражение выше соответствует только части кириллицы, а именно русскому алфавиту. Вообще, понятие кириллица существенно шире, и включает символы, используемые не только в современном русском алфавите, но и в ряде других славянских языков. Кириллические Unicode символы можно увидеть, например, здесь.

Тоже самое, касается и латиницы. Формально, помимо символов английского алфавита (/[a-z]/i), туда входит еще множество других символов, например, ñ из испанского алфавита. Регулярное выражение выше, соответствует только символам английского алфавита, а не всем символам латиницы.

UPD2:

Если же вы действительно хотите оставить в строке символы, которые формально входят в латиницу или кириллицу, то вы можете использовать следующий код:

preg_replace("/[^,\p{Cyrillic}\p{Latin}]/ui", '', $target);

Это регулярное выражение оставляет очень большой набор символов (например, кириллические символы ѥѧѭ). Не думаю, что его вообще стоит использовать, но для тех, кто формально относится к понятиям латиница и кириллица, оно может оказаться интересным.


Sarkis Allahverdian

Думаю, раз пользуетесь Юникодом, то и классы знаков нужно от туда использовать:

$key_words=preg_replace("/[^\p{L},\s]/u","",$key_words);

Тут оставляем \p{L} - все буквенные символы, , - запятую, \s - пробельные символы (для пробела нужно заменить на символ пробела).

Тестовый пример https://regex101.com/r/wF4gZ2/1

licensed under cc by-sa 3.0 with attribution.