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
Форумы портала PHP.SU :: Версия для печати :: Расстояние между словами
Форумы портала PHP.SU » PHP » Регулярные выражения » Расстояние между словами

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

1. supmener - 19 Июня, 2016 - 17:31:37 - перейти к сообщению
Пожалуйста помогите. Нужно задать расстояние между искомыми словами, "от" и "до" слов между ними. Например для "болезнь ноги". Чтобы найдено было также "болезнь связки правой голени ноги". То есть здесь дополнительно появилось 3 слова между ключевыми. А может быть и другое количество, например "болезнь правой ноги". То есть чтобы можно было указать интервал, образно "0-3" для этих примеров.
2. Строитель - 19 Июня, 2016 - 18:35:27 - перейти к сообщению
supmener пишет:
Чтобы найдено было также "болезнь связки правой голени ноги". То есть здесь дополнительно появилось 3 слова между ключевыми. А может быть и другое количество, например "болезнь правой ноги"
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'какой-то текст ... болезнь связки правой голени ноги ... ';//или болезнь ноги
  3. $pat = '~болезнь.*ноги~iu';
  4. preg_match($pat, $str, $arr);
  5.  
  6. echo $arr[0];//болезнь связки правой голени ноги
3. supmener - 19 Июня, 2016 - 18:38:56 - перейти к сообщению
Спасибо, может пригодиться. А можно ли написать вариант одной строкой без операторов PHP? Планирую задействовать в данный момент в локальном поисковике для поиска в документах с поддержкой регулярных выражений.
4. Строитель - 19 Июня, 2016 - 18:48:32 - перейти к сообщению
supmener пишет:
А можно ли написать вариант одной строкой без операторов PHP?
Ну, сам шаблон вот ~болезнь.*ноги~iu, а уж подойдёт ли он для ваших целей, я не знаю.
5. supmener - 19 Июня, 2016 - 18:51:20 - перейти к сообщению
А почему в обоих примерах у Вас не видно того, что относится к образно обозначенному интервалу "0-3" между ключевыми словами?
6. Строитель - 19 Июня, 2016 - 18:59:43 - перейти к сообщению
supmener пишет:
А почему в обоих примерах у Вас не видно того, что относится к образно обозначенному интервалу "0-3" между ключевыми словами?
Я предположил, что требуется поиск по ключевым словам, поэтому прописал их в шаблоне, а вместо интервала использовал любое количество любых символов. Если требуется чётко задать от 0 до 3 слов между ключевыми, то попробую составить новый шаблон.
7. supmener - 19 Июня, 2016 - 19:02:27 - перейти к сообщению
Да, нужна возможность чётко задавать интервал количества слов. А что значат знаки:
~болезнь.*ноги~iu, который выделил жирным шрифтом? И ~ тоже не знаю за что отвечает.
8. Строитель - 19 Июня, 2016 - 20:39:26 - перейти к сообщению
i - регистронезависимый
u - юникод
~ - ограничитель шаблона
supmener пишет:
Да, нужна возможность чётко задавать интервал количества слов
Попробую, но не гарантирую, что смогу написать.
9. supmener - 19 Июня, 2016 - 20:41:19 - перейти к сообщению
Хорошо, буду ждать.
10. Строитель - 19 Июня, 2016 - 21:30:36 - перейти к сообщению
supmener, вот что у меня получилось:

~болезнь(\s{1}|\s[а-я]+\s|\s[а-я]+\s[а-я]+\s|\s[а-я]+\s[а-я]+\s[а-я]+\s)ноги~iu

Находит комбинации:

1. болезнь связки правой голени ноги
т.е., 3 промежуточных слова

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

3. болезнь правой ноги
т.е., 1 промежуточное слово

Если промежуточных слов больше 3-х, например болезнь связки правой ... голени ноги, то совпадений не будет.
P.S.: наверняка шаблон можно и покороче написать, но у меня вышел только такой вариант.
11. supmener - 19 Июня, 2016 - 21:32:26 - перейти к сообщению
Большое спасибо. Завтра планирую испытать.
12. Строитель - 19 Июня, 2016 - 21:35:22 - перейти к сообщению
supmener пишет:
Большое спасибо. Завтра планирую испытать.
Я проверял на локалке - код работает
PHP:
скопировать код в буфер обмена
  1. $str = 'какой-то текст ... болезнь связки правой голени ноги ... ';
  2. $pat = '~болезнь(\s{1}|\s[а-я]+\s|\s[а-я]+\s[а-я]+\s|\s[а-я]+\s[а-я]+\s[а-я]+\s)ноги~iu';
  3. preg_match($pat, $str, $arr);
  4. echo $arr[0];//болезнь связки правой голени ноги
13. supmener - 19 Июня, 2016 - 21:35:32 - перейти к сообщению
А найдёт также "болезнь ноги"?
14. Строитель - 19 Июня, 2016 - 21:37:33 - перейти к сообщению
supmener пишет:
А найдёт также "болезнь ноги"?
Да, конечно Улыбка

 

Powered by ExBB FM 1.0 RC1