PHP - 使用多个通配符搜索字符串


PHP - searching a string using multiple wildcards

我试图确定字符串是否以字符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);