|
| Дата |
|
USD/RUB | 90.2486 | BTC/USD | 68777.7501 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
11.06.2015, 15:54
|
#1
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
|
Парсинг текста за исключением тэгов
Всем привет.
Вот такая задача стоит.. Нужно в тексте найти слова регуляркой, за исключением случае если слово находится в тэге (ссылка, картинка) или анкоре.
Язык PHP
Пример:
"text find me <a href="xxx.com/find">find</a><img src="tratat/find.jpg">find something here find"
Дак вот, preg_match_all должен найти 3 раза слово find, которые не в теге a, img и не анкор для ссылки. Выделил жирным что должно найтись.
Вопрос не в регулярки для поиска текста find, так как регулярка оч сложная своя. Вопрос в том, как отсеять потом найденные результаты если они не там где надо находятся, или же может есть какой фильтр для preg_match_all чтобы не искало в тегах...
Вобщем как то так =)
|
|
|
11.06.2015, 16:51
|
#2
|
Senior Member
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
|
Удали предварительно из текста все ссылки и картинки preg_replace'ом и все
preg_replace('#<a\s.+?</a>#is', '', $text);
preg_replace('#<img.+?>#is', '', $text);
З.Ы. Регулярки не тестил.
|
|
|
12.06.2015, 00:46
|
#3
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
|
ТС
Дак их то потом вернуть надо. Вобщем и целом задача такая: взять текст, добавить свои ссылки, залить обратно. При этом сохранив структуру текста что была раньше (включая все тэги)
|
|
|
12.06.2015, 02:18
|
#4
|
Member
Регистрация: 16.10.2014
Сообщений: 48
Бабло: $11785
|
Для этого есть парсинг DOM. берем то, что внутри тега, химичим с ним, и в этот же тег записываем. все уже придумано
|
|
|
12.06.2015, 07:26
|
#5
|
Senior Member
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
|
Цитата:
Сообщение от Dumpty
Дак их то потом вернуть надо.
|
Дак ты так бы сразу и сказал, а ты сказал, что надо только:
Цитата:
в тексте найти слова регуляркой, за исключением случае если слово находится в тэге (ссылка, картинка) или анкоре.
|
Без внятного ТЗ результат хз (С)
|
|
|
12.06.2015, 11:10
|
#6
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
В общем виде решить эту задачу обычным однопроходным regexp-парсером невозможно, т.к. html или xml не являются регулярными языками.
тут либо SAX/DOM, либо разработанный мною (n+1)-проходный рекурсивный нисходящий регулярный LL-парсер, использующий регекспы: http://chesser.ru/blog/html-regexp-p...xcluding-tags/
(n - число исключающих или "особенных" тегов)
по ссылке описан алгоритм и код, который нужно чуть-чуть доработать до нужного функционала.
DOM проще в использовании, но не везде доступен, удобен и кущает много ресурсов. Мой вариант такой же универсальный для решении подобных задач, работает везде, работает всего в n-раз медленнее простых регекспов, что есть быстро. DOM будет медленнее на несколько порядков, потому что там сложность минимум O(N^2)
Последний раз редактировалось chesser; 12.06.2015 в 11:16.
|
|
|
12.06.2015, 15:35
|
#7
|
Senior Member
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
|
ТС
Цитата:
Сообщение от chesser
В общем виде решить эту задачу обычным однопроходным regexp-парсером невозможно, т.к. html или xml не являются регулярными языками.
тут либо SAX/DOM, либо разработанный мною (n+1)-проходный рекурсивный нисходящий регулярный LL-парсер, использующий регекспы: http://chesser.ru/blog/html-regexp-p...xcluding-tags/
(n - число исключающих или "особенных" тегов)
по ссылке описан алгоритм и код, который нужно чуть-чуть доработать до нужного функционала.
DOM проще в использовании, но не везде доступен, удобен и кущает много ресурсов. Мой вариант такой же универсальный для решении подобных задач, работает везде, работает всего в n-раз медленнее простых регекспов, что есть быстро. DOM будет медленнее на несколько порядков, потому что там сложность минимум O(N^2)
|
реализовал по другому, но оч интересный пост если мой вариант не сработает, буду разбираться с твоим
Сделал так - беру все тэги "a", "img", смотрю их стартовую позицию в тексте и конечную. Пишу в массив (например 230-311). Далее нахожу нужный текст и сравниваю с массивом. Если нужный текст (стартовая позиция и конечная позиция (15-40 или 400-429) не входит ни в один диапазон из массива, значит это не тэг, и можно использовать.
Быдлокод?) Надо проверить в бою
|
|
|
12.06.2015, 16:08
|
#8
|
Senior Member
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
|
Цитата:
Сообщение от Dumpty
реализовал по другому, но оч интересный пост если мой вариант не сработает, буду разбираться с твоим
Сделал так - беру все тэги "a", "img", смотрю их стартовую позицию в тексте и конечную. Пишу в массив (например 230-311). Далее нахожу нужный текст и сравниваю с массивом. Если нужный текст (стартовая позиция и конечная позиция (15-40 или 400-429) не входит ни в один диапазон из массива, значит это не тэг, и можно использовать.
Быдлокод?) Надо проверить в бою
|
На первый взгляд выглядит логично) Быдло-не быдло код, какая особо разница, если делаешь для себя и тебе так удобнее)
Я, например, подумал, что можно все вхождения в теги заменить сначала на что-то не подпадающее под маску поиска (т.е. сначала нашел все вхождения find в тегах и заменил их на "хуяинд"), а после обработки сменить обратно ("хуяинд" -> find) - коряво и костыль, да и пох)
|
|
|
12.06.2015, 16:40
|
#9
|
Senior Medved
Регистрация: 15.06.2008
Сообщений: 4,146
Бабло: $22479945
|
Абсолюдно согласен говнокодерство примелимо когда кодишь для себя и не надо никому разбиратся в твоём коде... т.е делать по любому лиж бы работало.
|
|
|
|