2


我想知道我们是否可以if(preg_match('/boo/', $anything) and preg_match('/poo/', $anything))
用正则表达式替换..

$anything = 'I contain both boo and poo!!';

例如..

4

5 回答 5

3

根据我对您的问题的理解,您正在寻找一种方法来检查“poo”和“boo”是否都存在于仅使用一个正则表达式的字符串中。我想不出比这更优雅的方式了;

preg_match('/(boo.*poo)|(poo.*boo)/', $anything);

这是我能想到的确保两种模式都存在于字符串中而不管顺序的唯一方法。当然,如果您知道它们总是应该按相同的顺序排列,那会更简单=]

编辑 在阅读了 MisterJ 在他的回答中链接的帖子后,似乎可以使用更简单的正则表达式;

preg_match('/(?=.*boo)(?=.*poo)/', $anything);
于 2013-04-29T14:15:43.877 回答
2

通过使用管道:

if(preg_match('/boo|poo/', $anything))
于 2013-04-29T14:04:18.487 回答
1

您可以使用@sroes 提到的逻辑或:

if(preg_match('/(boo)|(poo)/,$anything))问题是你不知道哪一个匹配。

在这一个中,您将匹配“我包含嘘声”、“我包含便便”和“我包含嘘声和便便”。如果您只想匹配“我包含 boo 和便便”,那么问题真的很难弄清楚正则表达式:是否有 AND 运算符? 看来您将不得不坚持使用 php 测试。

于 2013-04-29T14:15:41.547 回答
0

正如其他人在其他答案中指出的那样,您可以通过更改正则表达式来实现这一点。但是,如果您想改用数组,因此您不必列出很长的正则表达式模式,请使用以下内容:

// Default matches to false
$matches = false;

// Set the pattern array
$pattern_array = array('boo','poo');

// Loop through the patterns to match
foreach($pattern_array as $pattern){
    // Test if the string is matched
    if(preg_match('/'.$pattern.'/', $anything)){
        // Set matches to true
        $matches = true;
    }
}

// Proceed if matches is true
if($matches){
    // Do your stuff here
}

或者,如果您只是尝试匹配字符串,那么如果您像这样使用它会更有效率strpos

// Default matches to false
$matches = false;

// Set the strings to match
$strings_to_match = array('boo','poo');

foreach($strings_to_match as $string){
    if(strpos($anything, $string) !== false)){
        // Set matches to true
        $matches = true;
    }
}

尽量避免使用正则表达式,因为它们的效率要低得多!

于 2013-04-29T14:11:19.510 回答
0

从字面上理解条件

if(preg_match('/[bp]oo.*[bp]oo/', $anything))
于 2013-04-29T14:14:08.873 回答