我想知道我们是否可以取代if(preg_match('/boo/', $anything) and preg_match('/poo/', $anything))
正则表达式..
$anything = 'I contain both boo and poo!!';
例如..
答案 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))