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