Php preg_match()以匹配给定条件之一

Php preg_match()以匹配给定条件之一,php,regex,preg-match,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('/

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

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, 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))
或者,您可以使用regex alternation组合这两个选项:

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))

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

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

$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);

描述整个任务。您希望什么输入是有效的?
$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);