Как я могу изменить свой код регулярного выражения для строковых мутаций, чтобы он также работал для букв с акцентом?
Например, строковая мутация в reges для «amor» должна быть такой же, как и для «āmōr». Я пытался просто включить акцентированные буквы, такие как ´ (?<= [aeiouāēīōūăĕĭŏŭ]) ´ но это не сработало.
Мой код:
$hyphenation = '~
(?<=[aeiou]) #each syllable contain a vowel
(?:
# Muta cum liquida
( (?:[bcdfgpt]r | [bcfgp] l | ph [lr] | [cpt] h | qu ) [aeiou] x )
|
[bcdfghlmnp-tx]
(?:
# ct goes together
[cp] \K (?=t)
|
# two or more consonants are splitted up
\K (?= [bcdfghlmnp-tx]+ [aeiou])
)
|
# a consonant and a vowel go together
(?:
\K (?= [bcdfghlmnp-t] [aeiou])
|
# "x" goes to the preceding vowel
x \K (?= [a-z] | (*SKIP)(*F) )
)
|
# two vowels are splitted up except ae oe...
\K (?= [aeiou] (?<! ae | oe | au | que | qua | quo | qui ) )
)
~xi';// hyphention
$result = preg_replace($hyphenation, '-$1', $input);
Акцентированное письмо может быть изображено несколькими способами в юникоде. Например ā
может быть кодовой точкой Unicode U + 0101 (LATIN SMALL LETTER A с MACRON), но также может быть комбинацией U + 0061 (LATIN SMALL LETTER A) и U + 0304 (COMBINING MACRON). (ссылка на сайт)
Следствие, написание (?<=[aeiouāēīōūăĕĭŏŭ])
правильно, если:
Вы используете модификатор u, чтобы сообщить движку pcre regex, что ваша строка и ваш шаблон должны читаться как строки UTF-8. В противном случае многобайтовые символы рассматриваются как отдельные байты, а не как нечто атомарное (это может быть проблематично и приводить к странным результатам, в частности, когда многобайтовые символы находятся внутри класса символов. Например, [eā]+
будет соответствовать «ē»).
Вы уверены, что целевая строка и шаблон используют одну и ту же форму для каждой буквы. Если шаблон использует U + 0101 и строку U + 0061 с U + 0304 для «ā», он не будет работать. Чтобы предотвратить эту проблему, вы можете применить $str = Normalizer::normalize($str);
к теме строки. Этот метод исходит от международный расширение.
Вы можете найти больше информации по этим ссылкам:
https://en.wikipedia.org/wiki/Unicode_equivalence
http://utf8-chartable.de/
http://php.net/manual/en/normalizer.normalize.php
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
http://pcre.org/original/pcre.txt
Других решений пока нет …