1

アクセント付きの文字でも機能するように、文字列の突然変異の正規表現コードを変更するにはどうすればよいですか? たとえば、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);
4

1 に答える 1

0

Unicode では、アクセント付きの文字をいくつかの方法で表すことができます。たとえばā、Unicode コード ポイント U+0101 (LATIN SMALL LETTER A WITH MACRON) の場合もありますが、U+0061 (LATIN SMALL LETTER A) と U+0304 (COMBINING MACRON) の組み合わせの場合もあります。(リンク)

結果、次の場合、書き込み(?<=[aeiouāēīōūăĕĭŏŭ])は正しいです。

  • u 修飾子を使用して、文字列とパターンを UTF-8 文字列として読み取る必要があることを pcre 正規表現エンジンに通知します。そうしないと、マルチバイト文字はアトミックなものとしてではなく、分離されたバイトとして認識されます (これは、特にマルチバイト文字が文字クラス内にある場合に問題が発生し、奇妙な結果が生じる可能性があります。たとえば、[eā]+"ē" と一致します)。

  • ターゲット文字列とパターンが各文字に同じ形式を使用していることを確認してください。パターンが 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

于 2016-11-07T20:34:39.543 に答える