我需要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。 - 通过{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);
提前谢谢。
答案 0 :(得分:3)
您感到困惑character classes和grouping。每当使用方括号时,您只能匹配一个字符。因此
[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
,你就可以更好地获得符合伪代码的城市。