| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Тексты > Регулярка для поиска нескольких слов |
| Автор: KgCoder 12.7.2009, 19:08 | ||||
| Уже третий день курю ману по регулярке. :( Помогите решить. Есть данные:
Как заменить все встречающиеся элементы из перменной $tag, чтобы текст после обработки был таким:
|
| Автор: enof 12.7.2009, 19:38 | ||
|
| Автор: ksnk 12.7.2009, 20:36 | ||
|
| Автор: KgCoder 12.7.2009, 21:23 | ||
При добавлении в массив $tags элемента:
Теги повторно оборачиваются :( |
| Автор: ksnk 12.7.2009, 22:27 |
| KgCoder, в моем примере тоже? |
| Автор: enof 12.7.2009, 22:41 |
| Автор: ksnk 12.7.2009, 23:08 |
| enof, O! 777 сообшений - нужно отметить! Это про что смайлик? Я там, типо, защищаюсь от нескольких пробелов в tags и в эталонном тексте. что-то не так? |
| Автор: enof 12.7.2009, 23:24 |
| Не могу понять, что такое "\\s+" в replacement и зачем юзать preg_quote для subject. |
| Автор: ksnk 12.7.2009, 23:43 | ||||
| enof, К примеру
В принципе, два слеша не очень то и нужны, с одним тоже работает... |
| Автор: enof 12.7.2009, 23:52 |
| ааа, все ясно, затупил чет |
| Автор: KgCoder 13.7.2009, 05:36 |
| Эхм, спасибо. Сейчас пересядю на PC и попробую. И еще один вопрос. Если скажем элементов в массиве $tag будет > 500, система не нагрузиться? В принципе у меня есть кеширование, но всё-же не хотелось бы получить timeout из-за регулярок. |
| Автор: KgCoder 13.7.2009, 07:24 | ||||
В общем потестил. Выложу полный код (Drupal):
Теги в массиве: Karakol river, Karakol peak, Karakol city, Karakol Результат обработки: Karakol river, goes near Karakol peak and enters Karakol city. Once more Karakol Сделал так:
Теги в массиве: Karakol river, Karakol peak, Karakol city, Karakol Результат: Karakol river, goes near Karakol peak and enters Karakol city. Once more Karakol Желаемый результат: Karakol river, goes near Karakol peak and enters Karakol city. Once more Karakol Если сказать короче, то каждый тег должен выделиться в тексте. Сейчас пытаюсь искать в модулях типа wiki, glossary, а также сторонних скриптах. Добавлено через 4 минуты и 14 секунд ksnk, enof, спасибо, что откликнулись. При завершении модуля, укажу вас в списке хороших людей на drupal.org. Мелочь а приятно. |
| Автор: ksnk 13.7.2009, 08:20 |
| Нужно отсортировать теги в массиве так, чтобы Karakol шел после Karakol river Насчет эффективности - тут надо тестировать, но чем больше регулярка, тем она медленее "работает", так что 500 элементов - это, наверное, многовато... Вообще-то можно заменить все найденные теги по методу enof, но не на конечный "ссылочный" тег, а на какой-нибудь закорюк - @TAG[ID]@, к примеру. После полной замены всех тегов, поменять все закорюки на нужные ссылки, вторым "проходом" по массиву |
| Автор: KgCoder 13.7.2009, 10:47 |
| ksnk, При сортировке и использовании моего варианта будет работать? Я тут подумал над сортировкой. Кажется придётся при добавлении записей БД делать strlen и вставлять её как еще один параметр :( Или я усложняю? |
| Автор: KgCoder 13.7.2009, 11:06 |
| Сделал сортировку. Использую мой регулярку. Результат: Karakol river, goes near Karakol peak and enters Karakol city. Once more Karakol Тег Каракол будучи последним втискивается в уже отмеченный Karakol river. :( |
| Автор: ksnk 13.7.2009, 11:14 | ||
сортировка массива по длине значения...
|
| Автор: enof 13.7.2009, 11:28 | ||
| Можно проверить, есть ли перед или после слова открывающий и закрывающий теги <a>. Добавлено через 6 минут и 12 секунд Вот так это будет выглядеть:
Этот же способ подойдет и к варианту ksnk. |
| Автор: KgCoder 13.7.2009, 12:00 |
| enof, действительно. Спасибо... сейчас попробую. |
| Автор: KgCoder 13.7.2009, 13:07 | ||
Простите, но у меня не выходит. Сделал так:
Резултат такой же: Karakol river, goes near Karakol peak and enters Karakol city. Once more Karakol |
| Автор: enof 13.7.2009, 16:42 | ||
А так все работает? |
| Автор: KgCoder 13.7.2009, 18:13 |
Нет :( Выделяет только Каракол четыре раза. :( |
| Автор: enof 13.7.2009, 18:36 |
| хм, текст в какой кодировке? |
| Автор: KgCoder 13.7.2009, 18:47 | ||||
| Utf-8... а у вас работает? Добавлено @ 18:56 Ваш вариант работает, оказывается файл сохранил как ansi. Но вот на инглише не работает:
Добавлено @ 18:57 Вернее выделяет только Karakol четыре раза и всё. Добавлено @ 18:58 Вот что произходит на инглише:
|
| Автор: enof 13.7.2009, 19:13 |
| сорри, мой косяк, опять с проверками запутался. Сейчас подумаю. |
| Автор: KgCoder 14.7.2009, 12:13 |
| Попробовал сам, через условия, но текст вообще не заменяется. :( Посмотрел сторонние модули, там используют mb_string и вообще функций типа preg не нашел. Код очень объемный там, и без комментов. В общем засада. :( Буду еще копать... надеюсь до завтра доживу |
| Автор: KgCoder 14.7.2009, 13:35 |
| Решил вопрос. Всем спасибо. |
| Автор: KgCoder 15.7.2009, 06:24 |
| Мне сказали, что можно это сделать через strpos и substr, при этом снизится нагрузка на сервер. Это правда? |
| Автор: KgCoder 16.7.2009, 06:42 |
| Что тут все такие пассивные стали? |