Войти

Показать полную графическую версию : [решено] Регулярное выражение для поиска и замены в Telegram Instant View


Vadikan
07-02-2019, 22:33
Всем привет!

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

Проблема
У меня или WordPress или платформа Genesis именно такой код и создает. Например, для этой статьи (http://www.outsidethebox.ms/19258/) я использую чистый 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 (https://instantview.telegram.org/docs#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
Не совсем понятно откуда будут поступать данные... допустим, что из файла...
Далее: а будет ли валидным например такой вариант:
<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
Не совсем понятно откуда будут поступать данные... допустим, что из файла... »
Сервис Instant View тянет страницу с веб-сайта и парсит HTML на основе моего (плюс своего) шаблона.

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

YuS_2
08-02-2019, 08:37
Сервис Instant View тянет страницу с веб-сайта и парсит HTML на основе моего (плюс своего) шаблона. »
Понятно.

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

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

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

Вот это:
@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
https://i.imgur.com/lxteLfh.png

Я проверил так

#содержимое статьи
@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
Ошибка та же. »
Причина ошибки:
не поддерживаются следующие конструкции
\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
YuS_2, спасибо. Регулярное выражение работает, но задачу не решает.

Если применять его к

//div или конкретнее - к телу статьи //div[has-class("entry-content")] (оно же $main), то вся статья превращается в один сплошной абзац (https://i.imgur.com/QrwSEM8.png)
$main/p, то вырезаются картинки (https://i.imgur.com/b60Ikyi.png)


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

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

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

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

Vadikan
09-02-2019, 01:11
Похоже с тегами регулярки напрямую не работают как с текстом »
Возможно. В примере 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
есть только манипуляция с классом внутри тега. »
В общем, всё оказалось гораздо проще. Разбор работы регэкспов к положительному результату не привел, т.к. скорее всего, они предназначены для работы именно внутри тегов, а не с тегами...
А для решения проблемы, надо просто заменить тег <p> с дочерним элементом <img/> на тег <figure>.
Сделать это можно, как раз, с помощью команды @replace_tag
так:
@replace_tag(<figure>): //p[child::img]
или так:
<figure>: //p[img]
- это эквивалентные записи, вторая просто укороченная и в части команды, и в части самого xPath.

Vadikan
09-02-2019, 12:26
YuS_2, спасибо, работает! Хехе, я стал жертвой неправильно поставленной задачи :)




© OSzone.net 2001-2012