2016-04-23 1 views
0

У меня есть регулярное выражение, которое пытается совместить 2 или более слов, но оно не работает, как предполагается. Что я делаю не так?Regex to match 2 или больше слов

$string = "i dont know , do you know?"; 
preg_match("~([a-z']+\b){2,}~", $string, $match); 

echo "<pre>"; 
print_r($match); 
echo "</pre>"; 

Ожидаемый результат:

Array (я не знаю)

Фактический результат:

Array()

+0

попробуйте preg_match_all, вместо этого. И бросить '{2,}' – ArtisticPhoenix

+0

@ArtisiticPhoenix. Мне на самом деле не нужен сопоставление $, мне просто нужно использовать preg_match в выражении if, поэтому я не уверен, что бы изменила preg_match_all. – frosty

+0

Тогда почему вы соответствуете словам? когда вы должны подсчитывать пробелы. – ArtisticPhoenix

ответ

1

Это будет соответствовать строка, которая содержит 2 слова или более точно:

/([a-zA-Z]+\s?\b){2,}/g вы можете пойти http://www.regexr.com/ и проверить его

PHP:

$string = "i dont know , do you know?"; 
preg_match("/([a-zA-Z]+\s?\b){2,}/", $string, $match); 

echo "<pre>"; 
print_r($match); 
echo "</pre>"; 

Примечание: не используйте/г в коде PHP

+1

Ooops. И вы абсолютно правы в отношении scaping, это моя калека IDE, показывающая ее как ошибку. И да, в шаблоне отсутствует \ b. Обновлен ответ. Он должен быть прямо сейчас. Спасибо –

+1

Это лучше. забудьте удалить группу захвата вокруг '[a-zA-Z]'. Проверьте свои шаблоны с помощью www.regex101.com, чтобы узнать количество шагов, необходимых для механизма регулярных выражений (это дает представление о сложности шаблона, отладчик тоже полезен). Если вы хотите улучшить свой шаблон, найдите способ «развернуть цикл». –

+0

Ницца, лучший сайт для тестирования, снова спасибо –

-1

Я думаю, что вам не хватает, как {} используются, чтобы соответствовать двум словам

preg_match_all('/([a-z]+)/i', 'one two', $match); 

if($match && count($match[1]) > 1){ 
     .... 

} 

Матч

array (
    0 => 
    array (
    0 => 'one', 
    1 => 'two', 
), 
    1 => 
    array (
    0 => 'one', 
    1 => 'two', 
), 
) 

Match будет иметь все матчи картины, так то его тривиальным просто посчитать их ...

При использовании

 preg_match('/(\w+){2,}/', 'one two', $match); 

Match is

array (
     0 => 'one', 
     1 => 'e', 
) 

явно не то, что вы хотите.

Единственный способ я вижу preg_match с этой /([a-z]+\s+[a-z]+)/

preg_match ([a-z']+\b){2,}http://www.phpliveregex.com/p/frM

preg_match ([a-z]+\s+[a-z]+)http://www.phpliveregex.com/p/frO

РЕКОМЕНДУЕМЫЙ

preg_match_all ([a-z]+)http://www.phpliveregex.com/p/frR (возможно, придется выбрать preg_match_all на сайте)

+0

Голосов без голосования? Ответ на вопрос – ArtisticPhoenix

0

Этот должен работать: ~([\w']+(\s+|[^\w\s])){2,}~g, который также соответствует строке, как "I do!"

Проверьте его here

 Смежные вопросы

  • Нет связанных вопросов^_^