У меня есть следующий код PHP:
$search = "foo bar que"; $search_string = str_replace(" ", "|", $search); $text = "This is my foo text with qué and other accented characters."; $text = preg_replace("/$search_string/i", "<b>$0</b>", $text); echo $text;
Очевидно, что «que» не соответствует «qué». Как я могу это изменить? Есть ли способ сделать preg_replace
игнорировать все акценты?
Символы, которые должны соответствовать (испанский):
á,Á,é,É,í,Í,ó,Ó,ú,Ú,ñ,Ñ
Я не хочу заменять все символы с акцентом перед применением регулярного выражения, потому что символы в тексте должны оставаться неизменными:
«Это мой текст foo с qué и другими акцентированными персонажами».
и не
«Это мой текст foo с que и другими акцентированными символами».
$search = str_replace( ['a','e','i','o','u','ñ'], ['[aá]','[eé]','[ií]','[oó]','[uú]','[nñ]'], $search)
Это и то же самое для верхнего регистра будет жаловаться на ваш запрос. Сторона примечания: ñ
звуки замещения мне недействительны, так как «niño» полностью отличается от «nino»,
Если вы хотите использовать захваченный текст в заменяющей строке, вы должны использовать классы символов в своей переменной $search
(в любом случае вы устанавливаете ее вручную):
$search = "foo bar qu[eé]"
И так далее.
Решение, которое я, наконец, использовал:
$search_for_preg = str_ireplace(["e","a","o","i","u","n"], ["[eé]","[aá]","[oó]","[ií]","[uú]","[nñ]"], $search_string); $text = preg_replace("/$search_for_preg/iu", "<b>$0</b>", $text)."\n";
Вы можете попробовать создать такой массив:
$vowel_replacements = array( "e" => "eé", // Other letters mapped to their other versions );
Затем, перед вызовом preg_match
, сделайте следующее:
foreach ($vowel_replacements as $vowel => $replacements) { str_replace($search_string, "$vowel", "[$replacements]"); }
Если я помню свое право на PHP, это должно заменить ваши гласные символьным классом их акцентированных форм – что будет держать его на месте. Он также позволяет вам легко менять строку поиска; вам не нужно забывать о замене гласных на классы персонажа. Все, что вам нужно запомнить, это использовать неаккуратную форму в строке поиска.
(Если есть какой-то специальный синтаксис, я забываю, что делает это без foreach
, прокомментируйте и дайте мне знать.)