我试图确定字符串是否以字符US,DS,UCS或DCS开头。
尽管只是做一个不必要的长 if 语句很诱人,但我认为有更好的方法,我一直在尝试使用正则表达式执行它,但没有乐趣:
$string = 'USQWERTY';
if(preg_match_all('|(US|DS|UCS|DCS)|', $string) // do something
它总是返回 false,我想知道是不是因为我没有使用通配符?我尝试在每个单词后使用 *,但不幸的是,我也没有任何乐趣。
非常感谢对此的任何建议,谢谢!
您应该使用不同的分隔符:
'/(US|DS|UCS|DCS)/'
我还注意到你这样说:
我试图弄清楚字符串是否以字符 US、DS、UCS 或 DCS 开头。
您使用的正则表达式将与字符串中任意位置的这些字符匹配。还应使用字符串锚点的开头,以仅在字符串的开头匹配:
'/^(US|DS|UCS|DCS)/'
您还缺少一个右括号,看起来您想使用 preg_match
而不是 preg_match_all
.
if (preg_match('/^(US|DS|UCS|DCS)/', $string))
首先,如果你想要的是一场比赛,你真的不需要preg_match_all。 preg_match就足够了。
其次,如果使用管道符号作为全局模式分隔符,则必须在模式本身中对其进行转义。选择通常的正斜杠符号更容易。)
最后,如果您只需要在字符串开始时匹配(带有一系列字母),则必须稍微更改正则表达式:
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) { ... }
在这个例子中对我有用:
<?php
$string = 'USdsa';
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) {
echo 'Matched!';
}
$string = 'DCSda';
if (preg_match('/^(?:US|DS|UCS|DCS)/', $string)) {
echo 'Matched again!';
}
$string = 'EWDS';
if (! preg_match('/^(?:US|DS|UCS|DCS)/', $string)) {
echo 'Not matched!';
}
?>
管道表示 OR,因此您需要从开头和结尾删除它,并确保其不区分大小写
/^(US|DS|UCS|DCS)/gi
您的问题是 PCRE 模式需要包含在分隔符中,如果要在模式中包含分隔符,则需要对其进行转义。
因此,如果您将正则表达式更改为以下之一,它应该可以工作:
-
'/(US|DS|UCS|DCS)/'
-
'|(US'|DS'|UCS'|DCS)|'
尽管我强烈建议使用第一种形式,因为在正则表达式中使用具有很多含义的符号作为 PCRE 分隔符很麻烦。
我不是正则表达式专家,主要是因为它只是混淆了我的蜂语。我写这个函数的速度非常快,可以为你检查。
function searchMultiple($n, $h) {
for ($i = 0; $i < count($n); $i++) {
if (stripos($h, $n[$i]) !== false) return TRUE;
}
}
$needles = array("US","DS","UCS","DCS");
$haystack = "We are looking for one of our needles in here, like maybe 'US'";
searchMultiple($needles, $haystack);