Парсинг текста за исключением тэгов - Форум успешных вебмастеров - GoFuckBiz.com
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB90.2486
BTC/USD68777.7501
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 11.06.2015, 15:54   #1
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
Отправить сообщение для Dumpty с помощью ICQ
По умолчанию Парсинг текста за исключением тэгов

Всем привет.
Вот такая задача стоит.. Нужно в тексте найти слова регуляркой, за исключением случае если слово находится в тэге (ссылка, картинка) или анкоре.
Язык 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 чтобы не искало в тегах...

Вобщем как то так =)
Dumpty вне форума  
Старый 11.06.2015, 16:51   #2
DimaX
Senior Member
 
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
По умолчанию

Удали предварительно из текста все ссылки и картинки preg_replace'ом и все

preg_replace('#<a\s.+?</a>#is', '', $text);
preg_replace('#<img.+?>#is', '', $text);

З.Ы. Регулярки не тестил.
DimaX вне форума  
Старый 12.06.2015, 00:46   #3
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
Отправить сообщение для Dumpty с помощью ICQ
автор темы ТС По умолчанию

Дак их то потом вернуть надо. Вобщем и целом задача такая: взять текст, добавить свои ссылки, залить обратно. При этом сохранив структуру текста что была раньше (включая все тэги)
Dumpty вне форума  
Старый 12.06.2015, 02:18   #4
AlexWM55
Member
 
Регистрация: 16.10.2014
Сообщений: 48
Бабло: $11785
По умолчанию

Для этого есть парсинг DOM. берем то, что внутри тега, химичим с ним, и в этот же тег записываем. все уже придумано
AlexWM55 вне форума  
Старый 12.06.2015, 07:26   #5
DimaX
Senior Member
 
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
По умолчанию

Цитата:
Сообщение от Dumpty Посмотреть сообщение
Дак их то потом вернуть надо.
Дак ты так бы сразу и сказал, а ты сказал, что надо только:
Цитата:
в тексте найти слова регуляркой, за исключением случае если слово находится в тэге (ссылка, картинка) или анкоре.
Без внятного ТЗ результат хз (С)
DimaX вне форума  
Старый 12.06.2015, 11:10   #6
chesser
автоматизирую интернеты
 
Аватар для chesser
 
Регистрация: 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)
__________________
USA и NL серверы и VPS | wiki | блог | Drupal | NginxТДС
Ave, Google, morituri te salutant! © chesser

Последний раз редактировалось chesser; 12.06.2015 в 11:16.
chesser вне форума  
Старый 12.06.2015, 15:35   #7
Dumpty
Senior Member
 
Аватар для Dumpty
 
Регистрация: 08.05.2008
Сообщений: 834
Бабло: $258860
ТС -->
Отправить сообщение для Dumpty с помощью ICQ
автор темы ТС По умолчанию

Цитата:
Сообщение от 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) не входит ни в один диапазон из массива, значит это не тэг, и можно использовать.

Быдлокод?) Надо проверить в бою
Dumpty вне форума  
Старый 12.06.2015, 16:08   #8
DimaX
Senior Member
 
Регистрация: 19.04.2007
Сообщений: 2,393
Бабло: $314345
По умолчанию

Цитата:
Сообщение от Dumpty Посмотреть сообщение
реализовал по другому, но оч интересный пост если мой вариант не сработает, буду разбираться с твоим

Сделал так - беру все тэги "a", "img", смотрю их стартовую позицию в тексте и конечную. Пишу в массив (например 230-311). Далее нахожу нужный текст и сравниваю с массивом. Если нужный текст (стартовая позиция и конечная позиция (15-40 или 400-429) не входит ни в один диапазон из массива, значит это не тэг, и можно использовать.

Быдлокод?) Надо проверить в бою
На первый взгляд выглядит логично) Быдло-не быдло код, какая особо разница, если делаешь для себя и тебе так удобнее)

Я, например, подумал, что можно все вхождения в теги заменить сначала на что-то не подпадающее под маску поиска (т.е. сначала нашел все вхождения find в тегах и заменил их на "хуяинд"), а после обработки сменить обратно ("хуяинд" -> find) - коряво и костыль, да и пох)
DimaX вне форума  
Старый 12.06.2015, 16:40   #9
dady
Senior Medved
 
Аватар для dady
 
Регистрация: 15.06.2008
Сообщений: 4,146
Бабло: $22479945
По умолчанию

Абсолюдно согласен говнокодерство примелимо когда кодишь для себя и не надо никому разбиратся в твоём коде... т.е делать по любому лиж бы работало.
__________________
Аппрув США >91% и Европа >90% Сливай фарму на Pharmcash - получай хрустящий кэш! / Спонсор! Докажи, что твоя партнерка №1 / 2019
dady вне форума