Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Регулярное выражение для поиска и замены в Telegram Instant View (http://forum.oszone.net/showthread.php?t=339109)

Vadikan 07-02-2019 22:33 2856774

Регулярное выражение для поиска и замены в Telegram Instant View
 
Вложений: 1
Всем привет!

Хочу запилить 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>

YuS_2 08-02-2019 00:23 2856790

Не совсем понятно откуда будут поступать данные... допустим, что из файла...
Далее: а будет ли валидным например такой вариант:
Код:

<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'

Vadikan 08-02-2019 01:17 2856796

Цитата:

Цитата 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

YuS_2 08-02-2019 08:37 2856813

Цитата:

Цитата 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

Vadikan 08-02-2019 10:58 2856831



Я проверил так
Код:

#содержимое статьи
@match("<p>\s*(<img [^>]*>)\s*</p>", 0, "ims"): //div[has-class("entry-content")]

и так
Код:

#родительский элемент содержимого статьи
@match("<p>\s*(<img [^>]*>)\s*</p>", 0, "ims"): //article

Ошибка та же.

YuS_2 08-02-2019 14:42 2856875

Цитата:

Цитата 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. Да, этот вариант обязан работать правильно.

Vadikan 08-02-2019 22:35 2856926

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

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

В редакторе это можно проверить, сравнив с версией 1.0. Надо закомментировать добавленное регулярное выражение и новую версию в первой строке так:
Код:

#~version: "2.0"
https://i.imgur.com/iAQWIRa.png

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

YuS_2 09-02-2019 00:23 2856935

Цитата:

Цитата Vadikan
Регулярное выражение работает, но задачу не решает. »

Да, как-то странно оно работает... не просто не решает, а коцает всю структуру.
С наскока победить не получилось, надо читать мануалы на этот Instant View. Похоже с тегами регулярки напрямую не работают как с текстом... завтра попробую разобраться, что там к чему.
Цитата:

Цитата Vadikan
В общем, это единственный нормальный способ просмотреть реальный IV. »

Это я уже понял... но могли бы дать возможность смотреть результат работы шаблонов, но в исходнике html, а не готовую картинку на смартфоне... ну, да ладно, не смертельно... :)

Vadikan 09-02-2019 01:11 2856942

Цитата:

Цитата 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>


YuS_2 09-02-2019 09:26 2856954

Цитата:

Цитата Vadikan
есть только манипуляция с классом внутри тега. »

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

@replace_tag(<figure>): //p[child::img]
или так:
Код:

<figure>: //p[img]
- это эквивалентные записи, вторая просто укороченная и в части команды, и в части самого xPath.

Vadikan 09-02-2019 12:26 2856977

YuS_2, спасибо, работает! Хехе, я стал жертвой неправильно поставленной задачи :)


Время: 08:15.

Время: 08:15.
© OSzone.net 2001-