如何修改字符串突变的正则表达式代码,以便它也适用于重音字母? 例如,“amor”的reges中的字符串变异应该与“ā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);
答案 0 :(得分:0)
在unicode中可以用几种方式表示重音字母。例如ā
可以是unicode代码点U + 0101(带有MACRON的LATIN SMALL LETTER A),但它也可以是U + 0061(LATIN SMALL LETTER A)和U + 0304(COMBINING MACRON)的组合。 (link)
结果,如果出现以下情况,写(?<=[aeiouāēīōūăĕĭŏŭ])
是正确的:
您使用u修饰符通知pcre正则表达式引擎您的字符串和模式必须读作UTF-8字符串。否则,多字节字符被视为分离的字节而不是原子(这可能会产生问题并产生奇怪的结果,特别是当多字节字符在字符类中时。例如[eā]+
将匹配“ē”)。< / p>
您确定目标字符串和模式对每个字母使用相同的表单。如果模式使用U + 0101而字符串U + 0061和U + 0304用于“ā”,则它将不起作用。要防止出现此问题,您可以将$str = Normalizer::normalize($str);
应用于主题字符串。此方法来自intl扩展名。
您可以在以下链接中找到更多信息:
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