我正在尝试计算一个字符串是否以字符 US,DS,UCS或DCS 开头。
就像只是做一个不必要的长if语句一样诱人,我觉得有更好的方法,我一直试图用正则表达式执行它,但没有任何乐趣:
$string = 'USQWERTY';
if(preg_match_all('|(US|DS|UCS|DCS)|', $string) // do something
它总是返回false,我想知道是不是因为我没有使用通配符?我试过在每个单词之后使用* s但不幸的是没有任何喜悦。
非常感谢任何关于此的建议,谢谢!
答案 0 :(得分:6)
您应该使用其他delimiter:
'/(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))
答案 1 :(得分:5)
首先,你真的不需要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!';
}
?>
答案 2 :(得分:1)
管道意味着OR,因此您需要从开头和结尾删除它,并确保其不区分大小写
/^(US|DS|UCS|DCS)/gi
答案 3 :(得分:1)
您的问题是PCRE patterns need to be enclosed within delimiters,如果您想在模式中包含分隔符,则需要将其删除。
因此,如果您将正则表达式更改为以下之一,则应该可以正常工作:
'/(US|DS|UCS|DCS)/'
'|(US\|DS\|UCS\|DCS)|'
虽然我强烈建议使用第一种形式,因为在正则表达式中使用具有很多含义的符号作为PCRE分隔符是很简洁的。
答案 4 :(得分:1)
我不是一名正则表达式专家,主要是因为它让我感到困惑。我写的这个功能非常快,可以检查你。
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);