替代if(preg_match()和preg_match())

时间:2013-04-29 14:02:35

标签: php regex preg-match conditional-statements


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

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

例如..

5 个答案:

答案 0 :(得分:3)

根据我对你的问题的理解,你正在寻找一种方法,只用一个正则表达式检查一个字符串中是否存在'poo'和'boo'。我想不出比这更优雅的方式;

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

这是我能想到的唯一方法,以确保字符串中存在两种模式而忽略顺序。当然,如果你知道他们总是应该按照相同的顺序,这将使它更简单=]

修改 阅读了MisterJ在他的回答中链接的帖子后,看起来似乎是一个更简单的正则表达式;

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

答案 1 :(得分:2)

使用管道:

if(preg_match('/boo|poo/', $anything))

答案 2 :(得分:1)

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

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

在这一个中,你将匹配"我包含boo","我包含poo"和#34;我包含嘘和便便"。 如果你只想匹配"我包含boo和poo",那么问题就更难找出Regular Expressions: Is there an AND operator? 而且你似乎必须坚持使用php测试。

答案 3 :(得分: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;
    }
}

尽可能避免使用正则表达式,因为效率低得多!

答案 4 :(得分:0)

采取条件字面

if(preg_match('/[bp]oo.*[bp]oo/', $anything))