Найти комбинацию вхождеий Х слов в произвольной последовательности

Статус
В этой теме нельзя размещать новые ответы.

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Есть Х слов. Например 4 шт:
aaa bbb ccc ddd.

Нужно регуляркой на php найти вхождение всех словосочитаний в тексте.
Словосочитание собирается обязательно из всех слов во всех возможных вариантах
aaa bbb ccc ddd
bbb aaa ccc ddd и т.д.


p.s.
Для усложнения каждое слово может содержать несколько слов с записью через ИЛИ.
aa|a bb|b cc|c dd|d

В усложненном варианте:
aa|a bb|b cc|c dd|d
bb|b aa|a cc|c dd|d и т.д.

p.s.s. Я уже год голову ломаю. Решил с вами поделиться.
 
Что-то задача явно записана не правильно. Лучше слова позначить просто как a, b, c, d.
Для усложнения каждое слово может содержать несколько слов с записью через ИЛИ
Это как, слово из слов? Лучше конкретные примеры напишите, иначе вы сами запутаетесь в условных значениях и других запутаете.
 
простой вариант
слово1 слово2 слово3 слово4
сложный вариант
(слово1a) |(слово1b)|(слово1c).... (слово2а)|(слово2b)

Надо найти для всевозможных комбинации их вхождение в текст. Ниже написал несклько комбинаций:
  • слово1 слово2 слово3 слово4
  • слово2 слово1 слово3 слово4
  • слово3 слово2 слово1 слово4
  • слово4 слово2 слово3 слово1
Если слов 4 шт, то надо найти 4! комбинаций, т.е 1*2*3*4=24 комбинации слов в тексте.
Для сложного варианта из 4 слов тоже 24 комбинации но каждое слово - это выбор из нескольких слов.

Приведу пример для поиска из 2 слов:
веселый чувак
Есть 2 варианта комбинации:
  • веселый чувак
  • чувак веселый
Т.е. надо найти в предложении (выделил жирным:(
Этот веселый чувак ушел .... и чувак веселый день ....

В усложненном варианте

(веселый)|(грустный)|(радостный) (чувак)|(парень)|(дед)|(мужик)|(мужчина)
Есть 2 варианта комбинации:
  • (веселый)|(грустный)|(радостный) (чувак)|(парень)|(дед)|(мужик)|(мужчина)
  • (чувак)|(парень)|(дед)|(мужик)|(мужчина) (веселый)|(грустный)|(радостный)
Т.е. надо найти в предложении (выделил жирным:(
Этот веселый чувак ушел .... и чувак веселый день .... грустный мужчина брел домой, а дед веселый смеялся.

Количество слов может быть разное и 5 и 10 шт. Хотелось бы это сделать одной регуляркой.
Есть вариант с составлением всех возможных вариантов в цикле, но не нравится.
 
1. Генерируешь всевозможные варианты порядка слов (можно взять алгоритмы размножения текстов и писать под них шаблоны, чтобы облегчить себе жизнь)
2. Ищешь вхождение каждого из вариантов в тексте, выделяешь жирным при совпадении

Альтернатива:
1. Составляешь универсальную регулярку для поиска вхождения любого из варианто
2. Используешь её

По быстродействию думаю оба варианта одинаковы, так как по сути выполняют аналогичные действия
 
Нужно регуляркой на php найти вхождение всех словосочитаний в тексте.
1. Составляешь универсальную регулярку для поиска вхождения любого из вариантов
Собственно я для этого и задал вопрос. Как создать такую универсальную регулярку? Мне мозгов не хватает. Множить варианты это не проблема, но мне не интересно.
 
Приведу пример для поиска из 2 слов:
веселый чувак
Регулярка: (веселый чувак|чувак веселый)

В усложненном варианте
(веселый)|(грустный)|(радостный) (чувак)|(парень)|(дед)|(мужик)|(мужчина)
Регулярка: ((веселый|грустный|радостный) (чувак|парень|дед|мужик|мужчина)|(чувак|парень|дед|мужик|мужчина) (веселый|грустный|радостный))

Думаю смысл понятен
 
Смысл понятен. Я про этот смысл писал уже 2 раза, что не хочу создавать такие длинные регулярки. Если бы была задача физически создать все возможные варианты в виде длинного текста, я бы написал в php ветку форума. :)

Мне же интересен другой подход в регулярках (для самообразования и последующего внедрения). Например реализовать это через обратный поиск или еще как-то без создания огромной простыни текстов... Наверняка такое возможно.
 
Какая задача - такое и решение. Я практически на 100% уверен, что короткую регулярку в данном случае не создать.
 
Для перебора всех вариантов регулярка будет такой
Код:
~(?:word1\s*|word2\s*|word3\s*|word4\s*){4}~
Где цифра в фигурных скобках количество слов, соответственно
 
Я правильно понимаю, что это будет работать при условии, что в тексте слова не повторяются?
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху