1

我试图确定一个字符串是否以字符US、DS、UCS 或 DCS开头。

尽管只做一个不必要的长 if 语句很诱人,但我认为有更好的方法,我一直在尝试使用正则表达式执行此操作,但没有任何乐趣:

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

它总是返回false,我想知道是不是因为我没有使用通配符?我尝试在每个单词后使用 *s,但不幸的是,我也没有对此感到高兴。

非常感谢您对此提出任何建议,谢谢!

4

5 回答 5

6

您应该使用不同的分隔符

'/(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))
于 2012-06-14T16:24:55.247 回答
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!'; 
}

?>
于 2012-06-14T16:28:43.487 回答
1

管道表示 OR,因此您需要从开头和结尾删除它,并确保其不区分大小写

/^(US|DS|UCS|DCS)/gi
于 2012-06-14T16:26:22.873 回答
1

您的问题是PCRE 模式需要包含在分隔符中,如果您想在模式中包含分隔符,则需要对其进行转义。

因此,如果您将正则表达式更改为以下之一,它应该可以工作:

  • '/(US|DS|UCS|DCS)/'
  • '|(US\|DS\|UCS\|DCS)|'

尽管我强烈建议使用第一种形式,因为在正则表达式中使用具有很多含义的符号作为 PCRE 分隔符会很麻烦。

于 2012-06-14T16:27:34.757 回答
1

我不是正则表达式专家,主要是因为它只是让我迷惑了beejeebus。我写的这个函数非常快,可以帮你检查。

  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);
于 2012-06-14T16:34:43.187 回答