首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重音字母在字符串突变正则表达式中的使用

重音字母在字符串突变正则表达式中的使用
EN

Stack Overflow用户
提问于 2016-11-06 20:34:24
回答 1查看 506关注 0票数 1

如何修改字符串突变的regex代码,使其也适用于重音字母?例如,reges中用于"amor“的字符串突变应该与"āmōr”的字符串突变相同。我只想简单地包括“(?<=aeiouāēīōūăĕĭŏŭ)”这样的重音字母,但这不起作用。

我的代码:

代码语言:javascript
复制
$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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 20:34:39

在unicode中,重音字母可以用多种方式表示。例如,ā可以是unicode编码点U+0101 (拉丁文小写字母A和马克龙),但也可以是U+0061 (拉丁文小写字母A)和U+0304 (组合马克龙)的组合。(链接)

因此,在以下情况下编写(?<=[aeiouāēīōūăĕĭŏŭ])是正确的:

  • 您使用u修饰符通知pcre regex引擎,您的字符串和模式必须读取为UTF-8字符串。否则,多字节字符被视为分离的字节,而不是原子的(这可能是有问题的,并产生奇怪的结果,特别是当多字节字符在字符类中时。例如,[eā]+将匹配"ē")。
  • 您可以确定目标字符串和模式对每个字母使用相同的形式。如果模式使用U+0101和带有U+0304的字符串U+0061来表示"ā",那么它将无法工作。若要防止此问题,可以将$str = Normalizer::normalize($str);应用于主题字符串。此方法来自英特扩展。

您可以在以下链接中找到更多信息:

等价性

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40454224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档