2012-01-24 3 views
0

私は整形したいファイル(.txt)を持っています。行は次のようになり=>regexpを使ったpreg_matchが最後の文字を失っています

Name on Company 
Street 7 CITY phone: 1234 - 56 78 91 Webpage: www.webpage.se 
http://www.webpage.se 

Name on Restaurant 
Street 11 CITY CITY phone: 7023 - 51 83 83 Webpage: 
http:// 

私は(大文字である)街にマッチしたい時に私がいる問題は、私の正規表現です。あなたはそれがスウェーデンの都市の私は、このようにZÅÄÖで働いているのである見ることができるようにこれまでのところ、私はこの=>

preg_match('/\b[A-ZÅÄÖ]{2,}[ \t][A-ZÅÄÖ]+|[A-ZÅÄÖ]{2,}\b/', $info, $city); 

woth出てきますよ。しかし、都市名の最後の文字が「ÅÄÖ」の場合、この正規表現は使用できません。

誰もが問題を見ていますか?事前に

おかげ

+1

あなたはマルチバイト文字を使用している場合は、正規表現文字列を使用してPHPファイルのテキスト、および(あなたのtxtファイルから) '$のinfo'のVARすべてがUTF8であることを確認してください、と常にオン' u'フラグを使用します正規表現。これは、preg_matchがバイトではなくUnicode文字を理解する唯一の方法です。 –

答えて

1

\bは、\wにある文字とそうでない文字の境界に一致すると定義されています。

スウェーデン固有の文字は\w(通常は[a-zA-Z0-9_]と同じです)にはありません。

代わりに、\bを適切な見回りアサーション(example)に置き換えることができます。

+0

/[-ZÅÄÖ] {2、} [\ t]は[A-ZÅÄÖ] + |は[-ZÅÄÖ] {2、} /私がやりましたこれが好きで、それがうまくいけば、これがあなたが意味するものなのかどうかはわかりませんが、とにかく/ Bの境界についての感謝、私のためのニュースです。 –

1

FWIW、これは例から、あなたの正規表現を開発し、テストするためにhttp://txt2re.comを使用する完璧場所であるように見えるためにだろう。

言われているように、末尾にスキップする原因となる正規表現には何も問題はないようです。ÅÄÖ文字。それらは他のアルファベット文字とまったく同じように扱われています。

私はUnicodeの問題を疑う。おそらく、入力データの末尾にÄがあり、Aとそれに続く別のdiaresis combining characterとして格納されています。これの解決策は正規表現を適用する前にnormalize the unicode stringです。

また、アンバーが指摘するように、問題は単語境界の定義である可能性があります。 docsと言うと、A "word" character is any letter or digit or the underscore character, that is, any character which can be part of a Perl "word". The definition of letters and digits is controlled by PCRE's character tables, and may vary if locale-specific matching is taking place. For example, in the "fr" (French) locale, some character codes greater than 128 are used for accented letters, and these are matched by \w.ですから、あなたのロケール設定を変更すると救済できます。

また、入力がUTF-8の場合は、upattern modifierを設定してみてください。

+0

ありがとう!偉大なサイト:) –

+0

これは本当に質問への答えは...おそらくコメントとして良いでしょう。あなたの両方に – Amber

+0

おかげで、私は行うには、いくつかの読書を持っているようだ:) –

関連する問題