regex, чтобы совместить символы с акцентом

У меня есть следующий код 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 , прокомментируйте и дайте мне знать.)