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。- 通过 { Velkom Krtisi }

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

您正在混淆字符类分组。每当您使用方括号时,您只能匹配一个字符。所以

[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,你只会得到更适合你的伪代码的城市。

工作演示。

于 2013-06-28T17:46:48.770 回答