2013-06-28 44 views
1

我需要在PHP中使用正則表達式來從長字符串中選擇城市名稱。正則表達式從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" 

} 

例子:

我表哥家住PRI城市。 - 通過{City}

Ja som bol vo Velkom Krtisi。 - 通過{Velkom Krtisi}

dnes索姆jedol palacinky v Dubnici nad Vahom。 - 通{Dubnici河畔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); 

預先感謝您。

+1

爲什麼最後一個例子會通過?在城市名稱前沒有提到的詞語。 –

回答

3

你很困惑character classesgrouping。無論何時使用方括號,只能匹配一個字符。因此

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

等於

[|VvpriOddDoZznaN] 

注意|是在那裏只是一個文字字符。另外,你最開始的兩個..是什麼?他們只是給你(並要求)在比賽中多出兩個角色。最後,三個詞最匹配(?:\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_OFFSET_CAPTURE

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

,當然,你只會得到更適合您僞碼的城市。

Working demo.