1 (изменено: john_dease, 2023-05-16 04:03:14)

Тема: AHK: Замена многострочного текста

По какой причине не срабатывает замена текста из переменной?

html =
(
<div class="pre">
<span><a HREF="" title=""></a></span>
</div>
)

(oHTML := ComObjCreate("HTMLFile")).write(html)
Loop % (all := oHTML.all).length 
{
    this := all[A_Index-1]
    Text := this.outerHTML
    ClassName := this.ClassName
    
    If (ClassName = "pre") {
       msgbox, href и title поменялись местами:`n`n%Text%
       StringReplace, html, html, %Text%, <<<<%Text%>>>>, All
    }
}
msgbox %html%

2 (изменено: john_dease, 2023-05-16 03:55:56)

Re: AHK: Замена многострочного текста

Заметил, что во время перебора, у поступившего в цикл хтмл-кода href и title меняются местами. Можно ли запретить такое изменение?

3

Re: AHK: Замена многострочного текста

А до перебора проверили?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4 (изменено: john_dease, 2023-05-16 20:07:14)

Re: AHK: Замена многострочного текста

До перебора он в точности такой, как в переменной "html". Но когда он попадает в цикл ком объекта, то href и title меняются местами. Видимо, это объект делает согласно какому-то внутреннему html-формату, где прописано, что в теге A href должно следовать после title. И так же что-то другое наверняка меняет.

5

Re: AHK: Замена многострочного текста

Запустив скрипт, это же видно.

6

Re: AHK: Замена многострочного текста

john_dease пишет:

Но когда он попадает в цикл ком объекта

Что за цикл ком объекта?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Замена многострочного текста

... ComObjCreate("HTMLFile")...
Loop

8

Re: AHK: Замена многострочного текста

Я удалил пост, спрашивал, как проверили. Ну если успели ответить, скажите, как именно.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Замена многострочного текста

john_dease пишет:
... ComObjCreate("HTMLFile")...
Loop

Это не цикл ком объекта, это просто цикл.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Замена многострочного текста

Я как раз спросил, почему вы думаете, что проблема в цикле, и проверяли ли вы до него.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Замена многострочного текста

Если запустить код из самого первого сообщения, то изначально переменная "html" содержит такой текст:

<div class="pre">
<span><a HREF="" title=""></a></span>
</div>

Но когда он поступает в цикл, перебирающий теги - то видоизменяется сам по себе, в частности: href и title меняются местами. Вот так я и заметил это - запускаю скрипт с переменной, которую сам не меняю, но при попадании в цикл в msgbox`е видно, что она изменена.

12

Re: AHK: Замена многострочного текста

teadrinker пишет:

Я как раз спросил, почему вы думаете, что проблема в цикле, и проверяли ли вы до него.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13 (изменено: john_dease, 2023-05-16 20:15:27)

Re: AHK: Замена многострочного текста

Наверняка проблема до него - но инициатором все равно является ком объект, который изменяет изначальную переменную.

14

Re: AHK: Замена многострочного текста

Правильно понимаю, что с тем что в ком объекте меняется текст, ничего нельзя поделать?

15

Re: AHK: Замена многострочного текста

1) С чего вы взяли что меняется текст?
2) Если решили парсить через dom, то используйте его методы, а не регулярку.

16 (изменено: john_dease, 2023-05-16 22:13:15)

Re: AHK: Замена многострочного текста

1) В результате работы кода из первого сообщения текст меняется (текст в переменной меняется с «HREF="" title=""» на «title="" href=""»). Или только у меня так?
2) Я и не использовал регулярки, а простую замену: полученный тег из перебора - обернуть угловыми скобками («%Text%» на «<<<<%Text%>>>>»).

17

Re: AHK: Замена многострочного текста

john_dease пишет:

текст в переменной меняется

При чем тут текст в переменной?
В dom текст нужно получать с помощью свойства outerText, например.

18

Re: AHK: Замена многострочного текста

Наверно имелся в виду innerText? Но он не подходит, так как берет текст без тегов.

19

Re: AHK: Замена многострочного текста

Без разницы.
Ищите другие способы.

20

Re: AHK: Замена многострочного текста

Другие способы перебора связанных тегов, мне неизвестны. А то что вносятся изменения вы подтверждаете? У вас так же меняется изначальная переменная в цикле? То есть, объект работающий с HTML - переставляет элементы внутри тегов.

21

Re: AHK: Замена многострочного текста

Конечно вносятся.

document := ComObjCreate("HTMLFile")
document.write("a")
msgbox % document.documentElement.outerHTML

22

Re: AHK: Замена многострочного текста

Но там другая ситуация: в цикле вычленяется тег <div class="pre">.*?</div>. Казалось бы, содержимое внутри этого тега должно быть идентичным исходной переменной. Но оказывается, что туда вносятся изменения - href и title меняются местами.

23

Re: AHK: Замена многострочного текста

Решайте задачу другим способом.
Вы ж не первый день занимаетесь парсингом хтмл.

24

Re: AHK: Замена многострочного текста

Решение есть в виде предварительных замен. Но мне хотелось убедиться, что есть настройка для ComObjCreate("HTMLFile") не менять теги.

25

Re: AHK: Замена многострочного текста

john_dease пишет:

Решение есть в виде предварительных замен.

Состоит в том, чтобы сначала пропустить всё содержимое исходной переменной через ком объект, чтобы внеслись все изменения согласно его формату, а потом всё остальное.

var2 =
(
<div class="pre">
<span><a href="" title=""></a></span>
</div><div></div>
)

(oHTML := ComObjCreate("HTMLFile")).write(var2)

Loop % (all := oHTML.all).length 
{
    this := all[A_Index-1]
    Text := this.outerHTML ;outerHTML/innerText
    ClassName := this.ClassName
    TagName := this.TagName
    
    If (TagName = "html") {
       var2 := RegExReplace(Text, "s)^<html><head></head><body>(.*)</body></html>$", "$1")
    }
}
msgbox new var2:`n`n%var2%

26

Re: AHK: Замена многострочного текста

Кому интересно, по ссылке сравнение оригинала страницы - со страницей, измененной ком объектом:

https://disk.yandex.ru/d/l9idCq4OI5ortg.