Я хочу знать, если мы можем заменить if(preg_match('/boo/', $anything) and preg_match('/poo/', $anything))
с регулярным выражением ..
альтернатива, если (preg_match() и preg_match())
$anything = 'I contain both boo and poo!!';
, например ..
Я хочу знать, если мы можем заменить if(preg_match('/boo/', $anything) and preg_match('/poo/', $anything))
с регулярным выражением ..
альтернатива, если (preg_match() и preg_match())
$anything = 'I contain both boo and poo!!';
, например ..
Из чего я понимаю ваш вопрос, вы ищете способ проверить, существуют ли BOTH 'poo' и 'boo' внутри строки, используя только одно регулярное выражение. Я не могу придумать более элегантный способ, чем это;
preg_match('/(boo.*poo)|(poo.*boo)/', $anything);
Это единственный способ, которым я могу думать, чтобы гарантировать, что оба шаблона существуют внутри строки, не обращая внимания на порядок. Конечно, если вы знали, что они всегда должны быть в том же порядке, что бы сделать его более простым =]
EDIT После прочтения поста, связанного с помощью MisterJ в своем ответе, казалось бы, более простым регулярным выражением может быть;
preg_match('/(?=.*boo)(?=.*poo)/', $anything);
По с использованием трубы:
if(preg_match('/boo|poo/', $anything))
этого недостаточно для замены –
Я думаю, что это заменяет: если (preg_match («/ бу /», ничего $) ** или ** preg_match ('/ poo /', $ anything) – iguider
Вы можете добиться этого, изменив свой обычный экспресс ион, как указывали другие в других ответах. Тем не менее, если вы хотите использовать массив вместо этого, так что вы не должны перечислить длинный регулярное выражение шаблон, а затем использовать что-то вроде этого:
// 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;
}
}
Старайтесь избегать регулярных выражений, где это возможно, поскольку они являются гораздо менее эффективными!
Для того, чтобы условия буквально
if(preg_match('/[bp]oo.*[bp]oo/', $anything))
Вы можете использовать логический или как было упомянуто @sroes:
if(preg_match('/(boo)|(poo)/,$anything))
проблема есть в том, что вы не знаете, какой из них соответствует.
В этом случае вы будете соответствовать «Я содержал boo», «Я содержал poo» и «Я содержал boo и poo». Если вы хотите только совместить «I have boo and poo», проблема действительно сложнее выяснить, Regular Expressions: Is there an AND operator? и кажется, что вам придется придерживаться теста php.
Сказать вам правду, это уже регулярное выражение –
@YourCommonSense Я имел в виду только одно регулярное выражение – iguider