preg_match()匹配给定条件中的任何一个

时间:2010-11-11 01:01:45

标签: php regex preg-match

昨天我在这里得到了一些帮助,让正则表达式接受输入,例如,

Plymouth, United Kingdom

但我意识到我也应该在下面接受这样的输入,

Plymouth, Devon, United Kingdom

所以我在下面的代码中添加了另一个表达式,现在它无法接受上述任何一个条件!我做错了什么?

if(!preg_match('/^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{4,}$/', $mem_town_city_country) || !preg_match('/^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{2,}[\,]{1}[a-zA-Z\s]{4,}$/', $mem_town_city_country))
{
    $error = true;
    echo '<error elementid="mem_town_city_country" message="TOWN/CITY, COUNTRY - sorry, they appear to be incorrect."/>';
}

如何使其接受输入

Plymouth, United Kingdom

Plymouth, Devon, United Kingdom

2 个答案:

答案 0 :(得分:1)

||更改为&&。如果 第一个正则表达式或第二个正则表达式不匹配,则当前代码将显示错误消息。您希望仅在两个正则表达式不匹配时显示错误消息。

if(!preg_match('/^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{4,}$/', $mem_town_city_country) && !preg_match('/^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{2,}[\,]{1}[a-zA-Z\s]{4,}$/', $mem_town_city_country))

或者,您可以使用正则表达式替换来组合两者:

if(!preg_match('/(^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{4,}$|^[a-zA-Z\s]{4,}[\,]{1}[a-zA-Z\s]{2,}[\,]{1}[a-zA-Z\s]{4,}$)/', $mem_town_city_country))

当然,可以缩短它,但在上面的代码示例中,我试图展示概念而不是使代码尽可能简洁

答案 1 :(得分:1)

或者你可以使用一个正则表达式,完成所有工作:

$input = 'Plymouth, Devon, United Kingdom';
$matched = preg_match('~^[a-z\s]{4,}(?:,[a-z\s]{4,}){1,2}$~i', $input, $matches);
var_dump($matched, $matches);