【问题标题】:PHP preg_match "AND" operatorPHP preg_match "AND" 运算符
【发布时间】:2014-03-06 11:05:14
【问题描述】:

我使用“或”运算符“|”匹配 $name 变量的单词之一:

$name = "one five six two";
if (preg_match('/(one|two)/i', $name)) {return true;}

如果preg_match 包含在 $name 中,我应该使用什么运算符来产生“AND”条件?

例如,

if (preg_match('/(two "AND" five)/i', $name)) {return true;}

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    如果您仍想使用正则表达式,则需要积极的前瞻:

    if (preg_match('/^(?=.*one)(?=.*two)/i', $name)) {return true;}
    

    不推荐用于简单的东西(有点矫枉过正),更复杂的东西会变得混乱......

    【讨论】:

    • 我可以使用单个 preg_match 函数来检查:[anything beging]two[anything middle]five[anything end]?
    • @KenTang 那不是一个preg_match吗?此外,它还在$name 中的任何位置查找onetwo
    • 复杂的单函数 (?=.*one)(?=.*two) 是否比双 preg_match 使用更多的 CPU 资源和计算时间?
    • @KenTang 如果$name 很长,是的。否则,差异应该不会太明显。
    • @patrick:Jerry 和所有其他响应者将问题解释为如何以任意顺序匹配两个特定单词。这需要两个前瞻。所以你不是在简化答案,而是在改变它。
    【解决方案2】:

    我认为你只需要将两个条件分开并使用&&,如下所示:

    if(preg_match('/(two)/i', $name) && preg_match('/(five)/i', $name)) {
        return true;
    }
    

    了解更多here

    【讨论】:

    • 我可以使用单个 preg_match 函数来检查:[anything]two[anything]five[anything] 吗?
    【解决方案3】:

    您可以不使用正则表达式就这样做:

    if (strpos($name, 'one') !== false && strpos($name, 'two') !== false) {
       // do something
    }
    

    【讨论】:

    • 也许可以解释您的答案中相同的false 部分? (文档说“使用 === 运算符来测试这个函数的返回值。”) - 不是否定,而是为什么它不能只是 strpos($name, 'one') 而没有 !== false。 (但没有“编辑:”、“更新:”或其他元谈话 - 答案应该看起来好像是今天写的)
    【解决方案4】:
    if ( preg_match('/two/i', $name) && preg_match('/five/i', $name) ) {return true;}
    

    【讨论】:

    • 我可以使用单个 preg_match 函数来检查:[anything]two[anything]five[anything] 吗?
    • 是的。正则表达式起初看起来令人生畏,但如果你花一点时间学习基础知识,从长远来看,它会带来很多回报。要回答您评论中的问题:preg_match('/.*two.*five.*/i', $name) 或者如果您想将整个字符串 $name 与此模式匹配,那么 preg_match('/^.*two.*five.*$/i', $name)
    • 最后一条评论似乎与Jerry's answer相矛盾。
    【解决方案5】:

    如果您只匹配一个单词,请不要使用preg_match。与strpos 相比,正则表达式使用更多的计算机资源。

    如果您只想检查一个字符串是否包含在另一个字符串中,请不要使用preg_match()。请改用strpos()strstr(),因为它们会更快(来自php.net)。

    if (str_pos($name, 'two') !== false
        && str_pos($name, 'five') !== false) {
    
        return true;
    }
    

    【讨论】:

    • 我不是投反对票的人,但是用正则表达式匹配一个词可能非常有用。例如,当 $name='fleetwood' 时,您的示例也匹配... regexp( '/\btwo\b/i', $name ) 不会。在您的 $name 中添加空格然后进行搜索会错过“一、二、三”,因为这两个附加了一个 '。同样,在这种情况下,正则表达式将是最好的解决方案......“匹配一个单词”与“一个字符串包含在另一个字符串中”不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2013-07-03
    • 2014-04-22
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多