2013-04-29 3 views
2


Я хочу знать, если мы можем заменить if(preg_match('/boo/', $anything) and preg_match('/poo/', $anything))
с регулярным выражением ..
альтернатива, если (preg_match() и preg_match())

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

, например ..

+1

Сказать вам правду, это уже регулярное выражение –

+0

@YourCommonSense Я имел в виду только одно регулярное выражение – iguider

ответ

3

Из чего я понимаю ваш вопрос, вы ищете способ проверить, существуют ли BOTH 'poo' и 'boo' внутри строки, используя только одно регулярное выражение. Я не могу придумать более элегантный способ, чем это;

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

Это единственный способ, которым я могу думать, чтобы гарантировать, что оба шаблона существуют внутри строки, не обращая внимания на порядок. Конечно, если вы знали, что они всегда должны быть в том же порядке, что бы сделать его более простым =]

EDIT После прочтения поста, связанного с помощью MisterJ в своем ответе, казалось бы, более простым регулярным выражением может быть;

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

По с использованием трубы:

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

этого недостаточно для замены –

+1

Я думаю, что это заменяет: если (preg_match («/ бу /», ничего $) ** или ** preg_match ('/ poo /', $ anything) – iguider

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; 
    } 
} 

Старайтесь избегать регулярных выражений, где это возможно, поскольку они являются гораздо менее эффективными!

+0

Почему downvote? Зачем комментировать? –

+0

это не я, кто никого из вас никому не мешает ..:/ – iguider

+0

Я очень ценю ваши ответы .. – iguider

0

Для того, чтобы условия буквально

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

Вы можете использовать логический или как было упомянуто @sroes:

if(preg_match('/(boo)|(poo)/,$anything)) проблема есть в том, что вы не знаете, какой из них соответствует.

В этом случае вы будете соответствовать «Я содержал boo», «Я содержал poo» и «Я содержал boo и poo». Если вы хотите только совместить «I have boo and poo», проблема действительно сложнее выяснить, Regular Expressions: Is there an AND operator? и кажется, что вам придется придерживаться теста php.