Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Регулярное выражение для поиска и замены в Telegram Instant View

Ответить
Настройки темы
Любой язык - [решено] Регулярное выражение для поиска и замены в Telegram Instant View

(*.*)


Сообщения: 36494
Благодарности: 6675


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Вложения
Тип файла: txt iv.txt
(1.4 Kb, 2 просмотров)
Всем привет!

Хочу запилить Instant View для блога, сейчас открылось окно, когда можно добавлять свой домен. У них сейчас вторая версия IV, где считается невалидным HTML-кодом img вложенный в p, так: <p><img ...></p>. В первой версии такой проблемы не было. Я в регулярных выражениях не силен, тем более с кастомным парсером.

Проблема
У меня или WordPress или платформа Genesis именно такой код и создает. Например, для этой статьи я использую чистый HTML без <p>, а в F12 вижу
Код: Выделить весь код
<p>
<img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла">
</p>
Не исключено, что где-то в других статьях в моем коде img может быть обернут в p, например в таком варианте (слэш в конце тега <img ... />)
Код: Выделить весь код
<p><img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла" /></p>
Задача
Вырезать <p> и </p> в таких конструкциях как выше, т.е. получить заменой
Код: Выделить весь код
<img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла">
<img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла" />

Документация
(Из РФ может понадобиться прокси или VPN)
Как я понимаю, можно использовать match или replace (чуть ниже на странице). Второй я использовал для других целей без регекспов, он работал.

Тренироваться при наличии аккаунта ТГ можно тут https://instantview.telegram.org/my/ Надо скормить ему URL статьи. Там, конечно, страшненько все выглядит.

Мой шаблон прикреплен. В текущем виде он выдает ошибку
Код: Выделить весь код
Element <img> is not supported in <p>: <img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла"/>
Спасибо за внимание к просьбе.
P.S. Пошиковский регексп к их match не подошел
Код: Выделить весь код
<p>\s*(<img.+/?>)\s*</p>

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 22:33, 07-02-2019

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Не совсем понятно откуда будут поступать данные... допустим, что из файла...
Далее: а будет ли валидным например такой вариант:
Код: Выделить весь код
<p>
<img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла">
<img src="/blog/wp-content/uploads/blog-images/date-modified01.png" height="149" width="280" alt="PowerShell дата создания файла">
</p>
? Или возможно ли присутствие других элементов между <p>...</p>? Или иные варианты вообще не рассматриваются?
Если строго по условиям из шапки, то:
powershell
Код: Выделить весь код
(gc test.html -raw -enc utf8) -replace '<p>\s*(<img [^>]*>)\s*</p>','$1'

-------
scio me nihil scire. Ѫ


Отправлено: 00:23, 08-02-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


(*.*)


Сообщения: 36494
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


Цитата YuS_2:
Не совсем понятно откуда будут поступать данные... допустим, что из файла... »
Сервис Instant View тянет страницу с веб-сайта и парсит HTML на основе моего (плюс своего) шаблона.

Цитата YuS_2:
Далее: а будет ли валидным например такой вариант: »
Им можно пренебречь. Даже если где-то у меня были две картинки подряд.
Цитата YuS_2:
Или возможно ли присутствие других элементов между <p>...</p>? »
Не знаю, но будем считать, что возможно (span и т.д.).
Цитата YuS_2:
Если строго по условиям из шапки, то:
powershell »
Регексп PowerShell не прокатывает, либо я не знаю, как правильно написать регексп для их синтаксиса. Ориентируясь на примеры в мануале, делаю
Код: Выделить весь код
@match("<p>\s*(<img [^>]*>)\s*</p>"): //p
REGEXP_ERROR: regexp pattern is empty

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 01:17, 08-02-2019 | #3


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
Сервис Instant View тянет страницу с веб-сайта и парсит HTML на основе моего (плюс своего) шаблона. »
Понятно.

Тогда почему match? Ведь:
Цитата Vadikan:
Задача
Вырезать <p> и </p> в таких конструкциях как выше, т.е. получить заменой »
то есть для задачи требуется @replace

Цитата Vadikan:
Не знаю, но будем считать, что возможно (span и т.д.). »
Тогда с этим сложнее, потому как регулярками парсить конструкции html со вложенными элементами сложно, а иногда просто невозможно, особенно если структура заранее неизвестна.

Цитата Vadikan:
Регексп PowerShell не прокатывает, либо я не знаю, как правильно написать регексп для их синтаксиса. Ориентируясь на примеры в мануале »
А вот это странно... у них в мануале идет отсыл на регэкспы PCRE, у powershell хоть регулярки из .net, но они вполне совместимые PCRE...
И это:
Цитата Vadikan:
REGEXP_ERROR: regexp pattern is empty »
строго говоря, неправда.

Вот это:
Цитата Vadikan:
@match("<p>\s*(<img [^>]*>)\s*</p>"): //p »
соответствует их требованиям из мануала...
Правда, eсть подозрение, что область поиска сводится не ко всей dom-структуре, а ограничивается конкретным элементом, описанным в xpath. Поэтому, необходимо расширить область поиска, т.е. указать надо не сам удаляемый элемент <p>, а родительский.
Можно попробовать это проверить так:
Код: Выделить весь код
@match("<p>\s*(<img [^>]*>)\s*</p>", 0, "ims"): //div
а потом уже использовать @replace

-------
scio me nihil scire. Ѫ


Отправлено: 08:37, 08-02-2019 | #4


(*.*)


Сообщения: 36494
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать




Я проверил так
Код: Выделить весь код
 #содержимое статьи
@match("<p>\s*(<img [^>]*>)\s*</p>", 0, "ims"): //div[has-class("entry-content")]
и так
Код: Выделить весь код
#родительский элемент содержимого статьи
@match("<p>\s*(<img [^>]*>)\s*</p>", 0, "ims"): //article
Ошибка та же.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 10:58, 08-02-2019 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
Ошибка та же. »
Причина ошибки:
не поддерживаются следующие конструкции
Код: Выделить весь код
\s - [ \t\n\r\f\v]
а именно нет поддержки:
Код: Выделить весь код
\v
в итоге получилось:
Код: Выделить весь код
@replace("<p[^>]*>[ \n\r\t\f]*(<img [^>]*>)[ \n\r\t\f]*</p>","$1","ims"): //div
- насколько работоспособен шаблон, не проверял... вечером, в спокойной обстановке гляну...

ЗЫ Проверил регулярки в Instant View. Да, этот вариант обязан работать правильно.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 08-02-2019 в 18:34. Причина: Дополнение.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:42, 08-02-2019 | #6


(*.*)


Сообщения: 36494
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


YuS_2, спасибо. Регулярное выражение работает, но задачу не решает.

Если применять его к
Второе неочевидно. Картинка видна в левой панели (исходная статья). Если в правой панели навести курсор между абзацами, где она должна быть, то при корректном результате там видно Photo (иногда сразу сопровождается урлом картинки).

В редакторе это можно проверить, сравнив с версией 1.0. Надо закомментировать добавленное регулярное выражение и новую версию в первой строке так:
Код: Выделить весь код
#~version: "2.0"
https://i.imgur.com/iAQWIRa.png

В ТГ это можно проверить так: нажать View in Telegram в правом верхнем углу → отправить ссылку себе в ТГ в сохраненные → смотреть на смартфоне.
В общем, это единственный нормальный способ просмотреть реальный IV.

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 22:35, 08-02-2019 | #7


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
Регулярное выражение работает, но задачу не решает. »
Да, как-то странно оно работает... не просто не решает, а коцает всю структуру.
С наскока победить не получилось, надо читать мануалы на этот Instant View. Похоже с тегами регулярки напрямую не работают как с текстом... завтра попробую разобраться, что там к чему.
Цитата Vadikan:
В общем, это единственный нормальный способ просмотреть реальный IV. »
Это я уже понял... но могли бы дать возможность смотреть результат работы шаблонов, но в исходнике html, а не готовую картинку на смартфоне... ну, да ладно, не смертельно...

-------
scio me nihil scire. Ѫ


Отправлено: 00:23, 09-02-2019 | #8


(*.*)


Сообщения: 36494
Благодарности: 6675

Профиль | Сайт | Отправить PM | Цитировать


Цитата YuS_2:
Похоже с тегами регулярки напрямую не работают как с текстом »
Возможно. В примере https://instantview.telegram.org/docs#replace есть только манипуляция с классом внутри тега.

Там есть еще https://instantview.telegram.org/docs#replace-tag но не похоже, что он принимает регэкспы. В примерах этого нет, и в лоб не прокатывает. Простая замена в нем работает у меня.
Код: Выделить весь код
@replace("Увеличить рисунок", ""): $main/p/a/text()
@replace_tag("<nobr>"): $main/p/a/br
Так я превращал
Код: Выделить весь код
<a href="..."><img src="..." /><br />Увеличить рисунок</a>
→
<a href="..."><img src="..." /></a>

-------
Канал Windows 11, etc | Чат @winsiders


Отправлено: 01:11, 09-02-2019 | #9


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата Vadikan:
есть только манипуляция с классом внутри тега. »
В общем, всё оказалось гораздо проще. Разбор работы регэкспов к положительному результату не привел, т.к. скорее всего, они предназначены для работы именно внутри тегов, а не с тегами...
А для решения проблемы, надо просто заменить тег <p> с дочерним элементом <img/> на тег <figure>.
Сделать это можно, как раз, с помощью команды @replace_tag
так:
Код: Выделить весь код
@replace_tag(<figure>): //p[child::img]
или так:
Код: Выделить весь код
<figure>: //p[img]
- это эквивалентные записи, вторая просто укороченная и в части команды, и в части самого xPath.

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 09-02-2019 в 09:31.

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:26, 09-02-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - [решено] Регулярное выражение для поиска и замены в Telegram Instant View

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - простое регулярное выражение для проверки email boguxa Скриптовые языки администрирования Windows 1 12-03-2018 22:02
[решено] Регулярное выражение для Total Commander'a MI-5 Хочу все знать 1 26-10-2017 22:18
Регулярное выражение venuko Вебмастеру 11 02-08-2010 18:18
Регулярное выражение для проверки денежной суммы BuilderMan Вебмастеру 9 23-08-2006 11:24
Регулярное выражение benya Вебмастеру 27 26-08-2005 14:34




 
Переход