Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Регулярные выражения - найти оба значения

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Cajka
Отправлено: 05 Июня, 2013 - 13:53:12
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




Мне нужно с помощью регулярного выражения найти два значения на страницы. Например, есть страница с текстов, нужно узнать упоминаются в тексте слова "яблоки" и "груши" . Причем, не или/или, а они должны оба быть (находится в тексте).
У меня регулярное выражение находит лишь первое слово, второе будто бы игнорирует.

Пишу так:
PHP:
скопировать код в буфер обмена
  1. preg_match("/яблоки|груши/i", $page, $match);
  2.  


В интернете искала, подходящего варианта не нашла. Может кто подскажет, как заставить регулярное выражение находить оба слова? Если, конечно, это возможно...
 
 Top
EuGen Администратор
Отправлено: 05 Июня, 2013 - 14:03:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Cajka
Лучше не делать это регулярными выражениями (а что, если нужно будет найти 3 слова? а 5?) - поскольку это предполагает перечисление всех возможных комбинаций. Для двух слов подойдет
PHP:
скопировать код в буфер обмена
  1. preg_match("/яблоки(.*?)груши|груши(.*?)яблоки/i", $page, $match);

- поскольку варианта следования всего 2. Для 5 слов, например, вариантов будет уже 5! = 120, так что лучше давать ответ на вопрос с помощью того же preg_match, но последовательно, так, например:
PHP:
скопировать код в буфер обмена
  1. $rgWords = array('груши', 'яблоки','сливы','вишни');
  2. $sText   = 'В списке фруктов были: груши, а также яблоки и вишни, но не сливы';
  3. $bWords  = !count(array_filter($rgWords, function($sWord) use ($sText)
  4. {
  5.    return !preg_match('/'.preg_quote($sWord).'/i', $sText);
  6. }));
  7. if($bWords)
  8. {
  9.    //все слова присутствуют
  10. }

- если требуется точное вхождение и не планируется использование регулярных выражений для конкретного слова, лучше использовать strpos для определения вхождения.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Cajka
Отправлено: 05 Июня, 2013 - 14:25:55
Post Id


Новичок


Покинул форум
Сообщений всего: 33
Дата рег-ции: Июнь 2012  


Помог: 0 раз(а)




EuGen
Спасибо вам за примеры, тогда попробую так.
Насчет strpos думала... может вы и правы. Найденные слова в принцессе нигде использоваться дальше не будут. Просто если они присутствуют, выполняется одно условие, если нет - то другое.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB