正则表达式从PHP中的字符串中选择城市名称

时间:2013-06-28 17:39:21

标签: php regex

我需要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"

}

示例:

我表弟生活在城市。 - 通过{City}

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

Dnes som jedol palacinky v Dubnici nad Vahom。 - 通过{Du​​bnici 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);

提前谢谢。

1 个答案:

答案 0 :(得分: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_match_all('/\b(?:vo?|pri|od|do|z|nad?)((?:\s+[a-z]+){1,3})/i', $string, $matches, PREG_OFFSET_CAPTURE);

当然,如果你遗漏PREG_OFFSET_CAPTURE,你就可以更好地获得符合伪代码的城市。

Working demo.