Я пытаюсь превратить заголовки в слизняки
$string = "آزمون پادشاهی متحده";
$pattern = '/[`~!@#$%^&*()_|+\=?;:..’“\'"<>,€£¥•،٫؟»«\{\}\[\]\\/]+/gi';
$replacement = '';
$slug = trim(preg_replace($pattern, $replacement, $string));
$slug = str_replace(" ","-",$slug);
В конечном результате пробелы آزمون-پادشاهی-متحده должны быть заменены дефисом.
Другой пример
название: Great Britain
пуля: great-britain
Как мне решить?
Вам нужно использовать регулярное выражение дважды. Сначала удалите дополнительный символ, а затем замените пробел на -
Попробуйте $pattern = '/[`~!@#$%^&*()_|+\=?;:..’“\'"<>,€£¥•،٫؟»«\{\}\[\]\\\\/]+/ui';. Кажется, проблема с неэкранированным \ в шаблоне рядом с модификатором u.






Здесь вам необходимо применить следующие исправления:
'\\\\'g, так как он не поддерживается PHP preg_replace (по умолчанию он заменяет все вхождения во входных данных)u, чтобы механизм PCRE мог анализировать как шаблон, так и входные данные как строки Unicode.Использовать
$string = "آزمون پادشاهی متحده";
$pattern = '/[`~!@#$%^&*()_|+=?;:..’“\'"<>,€£¥•،٫؟»«{}[\]\\\\/]+/ui';
$replacement = '';
$slug = trim(preg_replace($pattern, $replacement, $string));
$slug = str_replace(" ","-",$slug);
echo $slug;
Смотрите Демо PHP.
Обратите внимание, что [, =, { и } не являются специальными внутри класса символов и не нуждаются в экранировании.
Регулярное выражение PHP не поддерживает
g. Кроме того, вам понадобится модификаторu. Попробуйте$pattern = '/[~! @ # $% ^ & * () _ | + \ =?;: .. '«\'" <>, € £ ¥ • ، ٫؟ »« \ {\} [] \\\\ \ /] + / ui '; `