1

Тема: AHK: Удалить текстовый блок по ключевому слову

Как можно удалить повторяющийся текстовый блок по ключевому слову внутри его, используя функцию: RegExReplace

Пример части файла:

..........
</div>
<!-- Надо удалить этот текстовый блок -->
<div class="fld-grp clearfix grpelem" id="widgetu208" data-required="true" data-type="email"><!-- none box -->
 <span class="fld-input NoWrap actAsDiv rounded-corners clearfix grpelem" id="u212-4"><!-- content --><input class="wrapped-input" type="text" spellcheck="false" id="widgetu208_input" name="Email" tabindex="6"/><label class="wrapped-input fld-prompt" id="widgetu208_prompt" for="widgetu208_input"><span class="actAsPara">Введите адрес электронной почты *</span></label></span>
</div>
<!-- Конец части текста который надо удалить -->
<div class="clearfix grpelem" id="u232-4">
..........

Нужно удалить текстовые блоки начинающиеся от:
<div class ...         ... </div>

Можно зацепляться за такие ключевые слова в блоке текста:
data-type="email"
name="Email"
Введите адрес электронной почты

FRead := RegExReplace(FRead, "m)<div .*data-type=.email.>.*</div>")

Похожих блоков много, а удаль надо те в которых есть эти ключевые слова.

2 (изменено: Malcev, 2015-03-18 05:50:44)

Re: AHK: Удалить текстовый блок по ключевому слову

Возможно как-нибудь так:

newstr := RegExReplace(text, "m)<div class(.(?!<div))*(data-type=""email""|name=""Email""|Введите адрес электронной почты).*?</div>\R?")

3

Re: AHK: Удалить текстовый блок по ключевому слову

Благодарю, то что надо!

Еще тока не пойму как сделать если перед блоками стоят пробели или табы, что бы соответствующий блок удалялся, со своими пробельными символами, как будто его там не было? Пробовал подставлять в конце \r\n, \t и \s, но нету результата.
И что означает \R в вашем примере? В справке не нашел..

FRead = 
(
..........
        </div>
        <!-- Надо удалить этот текстовый блок -->
        <div class="fld-grp clearfix grpelem" id="widgetu208" data-required="true" data-type="email"><!-- none box -->
         <span class="fld-input NoWrap actAsDiv rounded-corners clearfix grpelem" id="u212-4"><!-- content --><input class="wrapped-input" type="text" spellcheck="false" id="widgetu208_input" name="Email" tabindex="6"/><label class="wrapped-input fld-prompt" id="widgetu208_prompt" for="widgetu208_input"><span class="actAsPara">Введите адрес электронной почты *</span></label></span>
        </div>
        <!-- Конец части текста который надо удалить -->
        <div class="clearfix grpelem" id="u232-4">
..........
)

FRead := RegExReplace(FRead, "m)<div class(.(?!<div))*(data-type=""email"").*?</div>\R?")
MsgBox %FRead%

4

Re: AHK: Удалить текстовый блок по ключевому слову

Разобрался, надо добавить в конце это: (\s)*

FRead := RegExReplace(FRead, "m)<div class(.(?!<div))*(data-type=""email"").*?</div>\R?(\s)*")

5

Re: AHK: Удалить текстовый блок по ключевому слову

Почему то не работает если поместить содержимое текста в файл:

..........
</div>
<!-- Надо удалить этот текстовый блок -->
<div class="fld-grp clearfix grpelem" id="widgetu208" data-required="true" data-type="email"><!-- none box -->
 <span class="fld-input NoWrap actAsDiv rounded-corners clearfix grpelem" id="u212-4"><!-- content --><input class="wrapped-input" type="text" spellcheck="false" id="widgetu208_input" name="Email" tabindex="6"/><label class="wrapped-input fld-prompt" id="widgetu208_prompt" for="widgetu208_input"><span class="actAsPara">Введите адрес электронной почты *</span></label></span>
</div>
<!-- Конец части текста который надо удалить -->
<div class="clearfix grpelem" id="u232-4">
..........
FileRead, FRead, *P65001 %A_Desktop%\111.html
FRead := RegExReplace(FRead, "m)<div class(.(?!<div))*(data-type=""email"").*</div>\R?(\s)*")
MsgBox %FRead%

В чем может быть проблема?
Если поместить этот текст в переменную, то все работает хорошо, а если поместить в файл и прочитать то ничего не катит...
У меня версия AutoHotkey Unicode.
Кодировка текста в файле UTF-8 без BOM

6

Re: AHK: Удалить текстовый блок по ключевому слову

FileRead, FRead, *t *P65001 %A_Desktop%\111.html
FRead := RegExReplace(FRead, "m)<div class(.(?!<div))*(data-type=""email"").*</div>\s*")
MsgBox %FRead%

\R - Начиная с версии 1.0.46.06, метасимвол \R замещает коды новой строки любого из употребляемых типов: `r, или `n, или `r`n.

7

Re: AHK: Удалить текстовый блок по ключевому слову

А почему в этом случае надо переводить `r`n на переводы строки `n ?
Специально для регулярного выражения?

8 (изменено: Malcev, 2015-03-19 00:41:36)

Re: AHK: Удалить текстовый блок по ключевому слову

Можно так:

FileRead, FRead, *P65001 %A_Desktop%\111.html
FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))*(data-type=""email"").*</div>\s*")
MsgBox %FRead%

s - Заставляет точку (.) соответствовать всем символам, включая символы новой строки (обычно она им не соответствует). Однако, когда новая строка используется в варианте по умолчанию CRLF (`r`n), для её обозначения требуется две точки, а не одна. Независимо от этой опции, отрицательный набор символов, такой как [^a], всегда соответствует новой строке.

http://www.script-coding.com/AutoHotkey/RegExMatch.html

9 (изменено: avens, 2015-03-19 01:00:53)

Re: AHK: Удалить текстовый блок по ключевому слову

Но уже работает не так как надо, удаляет весь текст который между блоками, если блоки повторяются:

..........
</div>
<!-- Надо удалить этот текстовый блок -->
<div class="fld-grp clearfix grpelem" id="widgetu208" data-required="true" data-type="email"><!-- none box -->
 <span class="fld-input NoWrap actAsDiv rounded-corners clearfix grpelem" id="u212-4"><!-- content --><input class="wrapped-input" type="text" spellcheck="false" id="widgetu208_input" name="Email" tabindex="6"/><label class="wrapped-input fld-prompt" id="widgetu208_prompt" for="widgetu208_input"><span class="actAsPara">Введите адрес электронной почты *</span></label></span>
</div>
<!-- Конец части текста который надо удалить -->
<div class="clearfix grpelem" id="u232-4">
..........
..........
..........
</div>
<!-- Надо удалить этот текстовый блок -->
<div class="fld-grp clearfix grpelem" id="widgetu208" data-required="true" data-type="email"><!-- none box -->
 <span class="fld-input NoWrap actAsDiv rounded-corners clearfix grpelem" id="u212-4"><!-- content --><input class="wrapped-input" type="text" spellcheck="false" id="widgetu208_input" name="Email" tabindex="6"/><label class="wrapped-input fld-prompt" id="widgetu208_prompt" for="widgetu208_input"><span class="actAsPara">Введите адрес электронной почты *</span></label></span>
</div>
<!-- Конец части текста который надо удалить -->
<div class="clearfix grpelem" id="u232-4">
..........
FileRead, FRead, *P65001 %A_Desktop%\111.html
FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))*(data-type=""email"").*</div>\s*")
MsgBox %FRead%

Тоже самое:

FileRead, FRead, *t *P65001 %A_Desktop%\111.html
FRead := RegExReplace(FRead, "m)<div class(.(?!<div))*(data-type=""email"").*</div>\s*")
MsgBox %FRead%

10

Re: AHK: Удалить текстовый блок по ключевому слову

А зачем жадность включил в конце?
Попробуй так:

FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))*(data-type=""email"").*?</div>\s*")

11

Re: AHK: Удалить текстовый блок по ключевому слову

Что то я не заметил что оно там включено.
Вроде теперь работает как надо.
Благодарю.

12 (изменено: avens, 2015-03-19 02:05:55)

Re: AHK: Удалить текстовый блок по ключевому слову

Не понимаю, те же аналогичные текстовые блоки в этом файле но не удаляются...
Наверное придется постоянно вручную удалять, что ли.

FileRead, FRead, *P65001 %A_Desktop%\index.html
FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))*(data-type=""email"").*?</div>\s*")
MsgBox %FRead%
Post's attachments

index.rar 1.88 kb, 5 downloads since 2015-03-19 

You don't have the permssions to download the attachments of this post.

13

Re: AHK: Удалить текстовый блок по ключевому слову

FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))*?(data-type=""email"").*?</div>\s*")

14

Re: AHK: Удалить текстовый блок по ключевому слову

Вроде бы работает. Но уже в который раз по удалял вручную.
Позже протестирую применение где файл с множеством блоков.

15

Re: AHK: Удалить текстовый блок по ключевому слову

Подобная ошибка описана в справке:
http://www.script-coding.com/AutoHotkey … place.html

ErrorLevel

Принимает одно из следующих значений:

    0, т.е. отсутствие ошибок.
    Строка следующего вида: Compile error N at offset M: описание. В этой строке N будет номером ошибки PCRE, M — позицией ошибочного символа внутри регулярного выражения, затем следует текст, описывающий ошибку.
    Отрицательное число, что означает, что произошла ошибка во время выполнения регулярного выражения. Хотя такие ошибки редки, с наибольшей вероятностью могут произойти следующие из них: "too many possible empty-string matches" (-22) (слишком много возможных совпадений с пустой строкой), "recursion too deep" (-21) (слишком глубокая рекурсия), "reached match limit" (-8) (достигнут лимит совпадений). Если они происходят, попробуйте перестроить регулярное выражение, чтобы сделать его более избирательным, например, заменив * на ?, + или на диапазон наподобие {0,3} везде, где это возможно.

Например, так с твоим примером тоже работает:

FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))+(data-type=""email"").*?</div>\s*")

16

Re: AHK: Удалить текстовый блок по ключевому слову

Неработает, а если также добавить после +?, тогда работает:

FRead := RegExReplace(FRead, "ms)<div class(.(?!<div))+?(data-type=""email"").*?</div>\s*")

А какой вариант лучше использовать что бы точно работало?

17

Re: AHK: Удалить текстовый блок по ключевому слову

Неработает,

У меня с твоим примером работает.

А какой вариант лучше использовать что бы точно работало?

Да в принципе, что один, что второй... Разницы не вижу.

18

Re: AHK: Удалить текстовый блок по ключевому слову

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

Post's attachments

index.rar 7.48 kb, 16 downloads since 2015-03-19 

You don't have the permssions to download the attachments of this post.

19

Re: AHK: Удалить текстовый блок по ключевому слову

Странно, почему зацикливается RegexReplace.
Попробуй так:

FileRead, FRead, *P65001 %A_Desktop%\index.html
pos := 1
while pos := regexmatch(FRead, "ms)<div class(.(?!<div))*?data-type=""email"".*?</div>\s*", found, pos)
   FRead := RegExReplace(FRead, found,,,1, pos)
MsgBox % FRead

20

Re: AHK: Удалить текстовый блок по ключевому слову

Вроде бы работает. Позже когда будет больше файлов попробую более детально.

21

Re: AHK: Удалить текстовый блок по ключевому слову

Может из этой оперы подойдёт, если тут речь только про HTML.

FileRead, FRead, *P65001 C:\Users\sergey\Desktop\index.html
oHTML := ComObjCreate("HTMLFile"), oHTML.write(FRead), i := 1
Loop % oHTML.getElementsByTagName("div").length
{
    el := oHTML.getElementsByTagName("div").item(A_Index-i)
    If (el.getAttribute("data-type")) = "email"
        el.parentNode.removeChild(el), i++
}
MsgBox % oHTML.body.InnerHTML
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Удалить текстовый блок по ключевому слову

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

23

Re: AHK: Удалить текстовый блок по ключевому слову

Ну да, оно возвращает код в соответствии с DOM структурой, думаю так меньше шансов "поломать" HTML код.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Удалить текстовый блок по ключевому слову

А так что бы не строгать табуляцию и регистр тегов никак?