2016-11-06 22 views
1

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

最初に[発音区別記号を削除する](http://stackoverflow.com/questions/3635511/remove-diacritics-from-a-string)して、必要なものと一致させることができます。あるいは '\ pL'(任意の言語の文字)や' \ pM'(文字とその派生語を一致させる)をunicode(u)フラグで指定することもできます。 –

+0

@Croutonix後で分音記号が必要です。分音符号を削除して後でtiを再度貼り付けることはできますか? '\ pL'または '\ pM'は関数のために何を持っていますか? –

答えて

0

アクセント付き文字は、Unicodeでのいくつかの方法で把握することができます。たとえば、āは、UnicodeコードポイントU + 0101(ラテン小文字のAとMACRON)でもかまいませんが、U + 0061(LATIN小文字A)とU + 0304(COMBINING MACRON)の組み合わせでもかまいません。あなたは、文字列とあなたのパターンはUTF-8文字列として読まれなければならないのPCRE正規表現エンジンに通知するために、U修飾子を使用

  • :場合(link)

    結果は、(?<=[aeiouāēīōūăĕĭŏŭ])を書くことは正しいです。さもなければ、マルチバイト文字は分離されたバイトとして認識され、アトミックなものではありません(マルチバイト文字が文字クラスの中にある場合、特に問題があり、奇妙な結果を生む可能性があります。例えば、[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

あなたが再現する完全な例(あなたのコードの多くを示すべきである
+0

u修飾子はどのように使用できますか?私はそのように '$ result = preg_replace($ hyphenation、 ' - $ 1'、$ input。" u ");' –

+0

@ChrisWinterbottom:区切り文字の後に、パターンの –

関連する問題