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 :: Версия для печати :: Поиск возможных комбинаций слов.. [2]
Форумы портала PHP.SU » PHP » Регулярные выражения » Поиск возможных комбинаций слов..

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

16. Dragon_Knight - 30 Апреля, 2013 - 00:28:46 - перейти к сообщению
Поверьте, перебор циклом кучу массивов, будет работать дольше, чем если я напишу тоже самое на php, и с сервера буду делать POST запрос на этот PHP, обрабатывать его там и возвращать обратно на сервер. Но это бред.

Я крайне зажат в ресурсах, тем более на встроенных функциях. Грубо говоря, пока сервер будет обрабатывать строку, все игроки 'зависнут', а за сутки под 100мб чата набегает..

Почему я упёрся в регулярку? тока потому, что она работает вне потока сервера, и пусть она хоть секунду обрабатывается...
17. DlTA - 30 Апреля, 2013 - 00:40:33 - перейти к сообщению
18. Champion - 30 Апреля, 2013 - 08:32:25 - перейти к сообщению
если чисто регуляркой, то
PHP:
скопировать код в буфер обмена
  1.  /(?:(?:дайте|дадите|можно).+?(?:админку|хелперку|хелпера)|(?:админку|хелперку|хелпера).+(?:дайте|дадите|можно))/is


Но если слов больше и порядок тоже не имеет значения, то таким способом можно задолбаться писать.

Можно сделать так (я напишу на PHP, Вы переведете на свой язык):
preg_match_all('/(дайте|дадите|можно)|(админку|хелперку|хелпера)/', $src, $m);
а потом циклом проверить, чтоб все элементы $m[1] были не пустые.

Что будет работать быстрее - preg_match_all + цикл по совпадниям или цикл со стрпозами - вопрос спорный. Регулярка почти всегда быстрее двух стрпозов (если она выполняет то же самое, что планируется сделать двумя стрпозами). А если матчить точное совпадение, то она сопоставима по скорости со стрпозом.
19. LIME - 30 Апреля, 2013 - 10:59:35 - перейти к сообщению
Champion пишет:
А если матчить точное совпадение, то она сопоставима по скорости со стрпозом.
как-то тут делали замер
на простейшую регулярку(точное совпадение)
стрпоз в 10 раз быстрее
20. Champion - 30 Апреля, 2013 - 12:32:23 - перейти к сообщению
Длина строки, время выполнения 1000000 итераций:
1. Искомая строка 5 символов близко к началу
int(3366) double(3.8106479644775) double(3.3490209579468)
2. Искомая строка 5 символов в конце (или вообще отсутствует)
int(3366) double(6.5905828475952) double(3.3512721347809)
3. Искомая строка находится ближе к концу, ее длина 1000 символов
int(3366) double(24.582785129547) double(2.3106808662415).

Последний случай - явление довольно редкое, а вот первые 2 показывают, что стрпоз сопоставим с регуляркой.
21. LIME - 30 Апреля, 2013 - 13:09:05 - перейти к сообщению
мэйби
однакож стоит хоть немного усложнить регулярку и посыпется в геометрической прогрессии(это замечание для новичков)
22. Champion - 30 Апреля, 2013 - 13:54:07 - перейти к сообщению
LIME пишет:
однакож стоит хоть немного усложнить регулярку и посыпется в геометрической прогрессии(это замечание для новичков)
Напиши-ка стрпозами то, что может сделать усложненная регулярка - что там посыпится?)
23. LIME - 30 Апреля, 2013 - 13:55:47 - перейти к сообщению
писал
не всегда необходима регулярка
24. Champion - 30 Апреля, 2013 - 14:53:31 - перейти к сообщению
А если есть под рукой, можешь продемонстрировать?
25. LIME - 30 Апреля, 2013 - 15:23:59 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $begin=strpos('begin',$str);
  2. substr($str,$begin,strpos('end',$str,$begin)-$begin);

(Добавление)
замеришь против регулярки?
26. nerv - 30 Апреля, 2013 - 19:01:33 - перейти к сообщению
LIME пишет:
не всегда необходима регулярка

+
если задачу можно решить без регулярки, ее надо решать без регулярки

Dragon_Knight пишет:
в которой присутствуют слова по такой маске: "(дайте|дадите|можно)&(админку|хелперку|хелпера)".

берешь текстовый редактор, пишешь в столбик словарь. Затем собираешь в одну регулярку с помощью "замены по регулярному выражению" Ха-ха

к слову: минус стрпоз - найдет подстроки внутри строки, что не всегда необходимо. Регуляркой можно "подрулить".
27. EuGen - 30 Апреля, 2013 - 20:06:45 - перейти к сообщению
А теперь представим, что вариантов с выбором будет не 2, а, например, 4. Или 6 ? В соответствии с числом перестановок количество требуемых вариантов будет расти по факториалу, то есть для 4-х это уже 24, а для 6 - 720 и т.п.
28. Champion - 30 Апреля, 2013 - 20:41:21 - перейти к сообщению
LIME пишет:
замеришь против регулярки?

float(3.1662002086639) float(2.857399892807) на короткой строке
float(3.5562990188599) float(2.9403080463409) на длинной
Та таком простеньком регулярка тоже проиграла. Но она удобнее читается)
29. nerv - 01 Мая, 2013 - 00:04:56 - перейти к сообщению
EuGen пишет:
А теперь представим

не буду представлять Закатив глазки

nerv пишет:
если задачу можно решить без регулярки, ее надо решать без регулярки

давайте понимать это в пределах разумного Подмигивание

Любую задачу связанную с обработкой теста можно решить без регулярки. Однако, регулярные выражения созданы (будем наедятся) с целью упростить решение поставленных задач, зачастую не травильных. И когда я говорю фразу выше, подразумеваю решение с использованием простых строковых функций без нагромождения кода и т.п. Т.е., если задачу можно решить просто, ее надо решать просто. Если нет, регулярные выражения в помощь.
30. Dragon_Knight - 01 Мая, 2013 - 03:40:12 - перейти к сообщению
А тема-то разгорелась Радость
Если честно, я пока отказался от этой идеи, но появился чисто спортивный интерес, как-же всётаки такое реализовать, на родной языке, это я про PHP Хорошо.

Уточню суть задачи: Сделать инструмент, желательно гибкий и простой в обращении, который позволит в строке, набранной человеком, находить определённые группы слов, по которым можно было-бы определить суть текста и соответственно на него отреагировать.
Самое простое что приходит на ум, это взять любую систему антимата и расковырять её, но там есть один нюанс, в нем идёт проверка по одному слову, когда в данной задачи нужно находить несколько ключевых слов.
Иными словами написать некое подобие чат бота, но настроенный на конкретные ключевые слова.

Как пример на конструкцию "(дайте|дадите|можно)&(админку|хелперку|хелпера)" нада послать пользователя на.. форум Радость.
Расшифровка примера (Отобразить)


Поиграв с регулярками на сайте: http://rubular[dot]com/ (Кстати, отличный сайт для отладки регулярок), не смог добиться результата, даже приближённо к поставленной задачи.

 

Powered by ExBB FM 1.0 RC1