1

長い文字列から都市名を選択するには、PHP で正規表現が必要です。

基本的な疑似コードは次のとおりです。

if ( 
     "v"   or   "V"     or 
     "vo"  or   "Vo"    or 
     "pri" or   "Pri"   or 
     "od"  or   "Od"    or 
     "z"   or   "Z"     or  
     "na"  or   "Na"    or 
     "nad" or   "Nad"   or 
     "do"  or   "Do"    or
     "pod" or   "Pod"  


is_before "String" or 
          "String String" or 
          "String string String" or 
          "String String String"
)
do 
{
   add "String String String" to array"

}

例:

私のいとこはプリシティに住んでいます。- パス { 市 }

Ja som bol vo Velkom Krtisi. - pass { Velkom Krtisi }

Dnes som jedol palacinky v Dubnici nad Vahom. - pass { Dubnici nad Vahom }

私の試み:

preg_match_all('/..[V|v|pri|Pri|Od|od|Do|do|Z|z|na|Na|Nad|nad][ ][A-Z]{0,10}/', $string, $matches, PREG_OFFSET_CAPTURE);

前もって感謝します。

4

1 に答える 1

3

文字クラスグループ化を混同しています。角かっこを使用するときはいつでも、1 つの文字のみに一致させることができます。したがって

[V|v|pri|Pri|Od|od|Do|do|Z|z|na|Na|Nad|nad]

に等しい

[|VvpriOddDoZznaN]

|そこにあるのは単なる別のリテラル文字であることに注意してください。さらに、..あなたが最初に始めた2つは何ですか?彼らはあなたに試合でさらに2人のキャラクターを与える(そして必要とする)だけです. 最後に、3 つの単語が によって最もよく一致し(?:\s+[a-zA-Z]+){1,3}ます。

最後に、(括弧を使用して) 必要な部分をキャプチャする必要があります。

preg_match_all('/(?:V|v|pri|Pri|Od|od|Do|do|Z|z|na|Na|Nad|nad)((?:\s+[A-Za-z]+){1,3})/', $string, $matches, PREG_OFFSET_CAPTURE);

$matches[1]すべての都市 (先頭のスペースを含む) と文字列内のオフセットが含まれるようになりました。

i修飾子 (大文字と小文字を区別しない)を使用すると、おそらくこれを短縮できます。もちろん、これはpRIたとえば可能ですが、おそらくそれは問題ではありません。また、単語の境界を追加して、次のようなabcdefv foobarことが一致をトリガーしないようにすることもできます (末尾の が原因でv):

preg_match_all('/\b(?:vo?|pri|od|do|z|nad?)((?:\s+[a-z]+){1,3})/i', $string, $matches, PREG_OFFSET_CAPTURE);

もちろん、PREG_OFFSET_CAPTUREを省略すると、疑似コードにより適した都市が得られます。

動作デモ。

于 2013-06-28T17:46:48.770 に答える