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

时间:2012-06-14 16:22:42

标签: php regex

我正在尝试计算一个字符串是否以字符 US,DS,UCS或DCS 开头。

就像只是做一个不必要的长if语句一样诱人,我觉得有更好的方法,我一直试图用正则表达式执行它,但没有任何乐趣:

$string = 'USQWERTY';
if(preg_match_all('|(US|DS|UCS|DCS)|', $string) // do something

它总是返回false,我想知道是不是因为我没有使用通配符?我试过在每个单词之后使用* s但不幸的是没有任何喜悦。

非常感谢任何关于此的建议,谢谢!

5 个答案:

答案 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);