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

从PHP中的字符串中选择城市名称的正则表达式,php,regex,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"

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

}
示例:

我表弟住在普里城通过{城市}

是的,我想我会的通过{Velkom Krtisi}

德内斯·索姆·杰多尔·帕拉辛基诉杜布尼奇·纳德·瓦霍姆案。-通过{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);
提前谢谢你。

你弄糊涂了。无论何时使用方括号,都只能匹配一个字符。所以

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

[|VvpriOddDoZznaN]
请注意,
|
只是其中的另一个文字字符。另外,两个
是如何开始的?他们只是在比赛中给你(并要求)两个以上的角色。最后,
(?:\s+[a-zA-Z]+){1,3}
最匹配三个单词

最后,您需要捕获所需的零件(使用括号):

现在,
$matches[1]
将在字符串中包含所有城市(包括前导空格)及其偏移量

您可能可以通过使用
i
修饰符(不区分大小写)来缩短此时间。当然,例如,这将允许
pRI
,但这可能不是问题。此外,您可能希望添加单词边界,以便像
abcdefv foobar
这样的事情不会触发匹配(由于后面的
v
):

当然,如果省略了
PREG\u OFFSET\u CAPTURE
,您只需要得到更适合伪代码的城市


为什么最后一个示例会通过?城市名称前面没有提到的任何单词。
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);
preg_match_all('/\b(?:vo?|pri|od|do|z|nad?)((?:\s+[a-z]+){1,3})/i', $string, $matches, PREG_OFFSET_CAPTURE);