#include <StringConstants.au3> ; to declare the Constants of StringRegExp
#include <Array.au3> ; UDF needed for _ArrayDisplay and _ArrayConcatenate
Local $sRegex = "(?xuJi)(?(DEFINE) #Это блок с объявлением функций" & @CRLF & _
"" & @CRLF & _
" #Этот блок - единственное место, где нужно подставлять значения" & @CRLF & _
" (?<tagName>ul) #Имя тега" & @CRLF & _
" (?<attrName>class) #Атрибут тега" & @CRLF & _
" (?<attrValue>ul) #Значение тега" & @CRLF & _
"" & @CRLF & _
" (?<anyAttrName>[^\s\>\=]*+) #Любое название атрибута" & @CRLF & _
" (?<anyAttrValue>\"[^\"]*+\"|\'[^\']*+\'|\`[^\']*+\`|[^\s\>]*+) #Любое значение атрибута" & @CRLF & _
" (?<anyAttr>(?&anyAttrName)\s*+(?:\=\s*+(?&anyAttrValue)\s*+)?+) #Любой атрибут" & @CRLF & _
"" & @CRLF & _
" #Если нужно найти точное вхождение значения атрибута" & @CRLF & _
" (?<attr>" & @CRLF & _
" (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута" & @CRLF & _
" (?: #Поиск точного вхождения" & @CRLF & _
" \"(?&attrValue)\"|" & @CRLF & _
" \'(?&attrValue)\'|" & @CRLF & _
" \`(?&attrValue)\`|" & @CRLF & _
" (?&attrValue)(?=[\s\>])" & @CRLF & _
" )" & @CRLF & _
" )" & @CRLF & _
"" & @CRLF & _
" #Если нужно искать в атрибуте значение как в классах" & @CRLF & _
" (?<attrClass>" & @CRLF & _
" (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута" & @CRLF & _
" (?: #Поиск значения как в классах" & @CRLF & _
" \"[^\"]*?\b(?&attrValue)\b[^\"]*+\"|" & @CRLF & _
" \'[^\']*?\b(?&attrValue)\b[^\']*+\'|" & @CRLF & _
" \`[^\`]*?\b(?&attrValue)\b[^\`]*+\`|" & @CRLF & _
" (?&attrValue)(?=[\s\>])" & @CRLF & _
" )" & @CRLF & _
" )" & @CRLF & _
"" & @CRLF & _
" #В зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута" & @CRLF & _
" #Строгое сравнение значения" & @CRLF & _
" (?<tag>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attr)(?&anyAttr)*?\>) #Использовать так: (?&tag)" & @CRLF & _
" #Поиск значения как в классах" & @CRLF & _
" (?<tagClass>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attrClass)(?&anyAttr)*?\>) #Использовать так: (?&tagClass)" & @CRLF & _
"" & @CRLF & _
") #Этот огровный блок с функциями закончился" & @CRLF & _
"" & @CRLF & _
"(?:[^\<]++(*SKIP)|\G|\C*?(?<parentTag>(?&tagClass)))[^\<]*+\K #После того, как нашли тег сбросили состояние нулевой группы" & @CRLF & _
"(?<openTag>\<li\b\s*+(?&anyAttr)*+\>) #У тега могут быть атрибуты" & @CRLF & _
"(?<innerHTML>\C*?) #Внутреннее содержимое тега" & @CRLF & _
"(?<closeTag>" & @CRLF & _
" \<\/li\b\s*+(?&anyAttr)*+>| #В HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается" & @CRLF & _
" (?=(?&openTag))| #Теги элементов списка необязательно закрывать согласно документации" & @CRLF & _
" (?=(?<closeParentTag>\<\/ul\b\s*+(?&anyAttr)*+\>)) #Закрытие списка закрывает последний элемент" & @CRLF & _
")"
Local $sString = "<ul>" & @CRLF & _
" <li class="li anyClass">aaa</li>" & @CRLF & _
" <li>bbb" & @CRLF & _
" <li>ccc" & @CRLF & _
"</ul>" & @CRLF & _
"<p>какой-то текст</p>" & @CRLF & _
"<ul data-class="ul anyClass" class="ul anyClass" data-id=`ul` id='ul' data-data=ul data-empty>" & @CRLF & _
" <li class="li anyClass">aaa</li>" & @CRLF & _
" <li >aaa</li>" & @CRLF & _
" <li>bbb" & @CRLF & _
" <li>ccc" & @CRLF & _
"</ul>" & @CRLF & _
"<p>какой-то текст</p>" & @CRLF & _
"<ul>" & @CRLF & _
" <li class="li anyClass">aaa</li>" & @CRLF & _
" <li>bbb" & @CRLF & _
" <li>ccc" & @CRLF & _
"</ul>" & @CRLF & _
"<p>какой-то текст</p>" & @CRLF & _
"<ul data-class="ul anyClass" class="ul anyClass" data-id=`ul` id='ul' data-data=ul data-empty>" & @CRLF & _
" <li class="li anyClass">aaa</li>" & @CRLF & _
" <li>bbb" & @CRLF & _
" <li>ccc" & @CRLF & _
"</ul>" & @CRLF & _
"<p>какой-то текст</p>" & @CRLF & _
"<ul>" & @CRLF & _
" <li class="li anyClass">aaa</li>" & @CRLF & _
" <li>bbb" & @CRLF & _
" <li>ccc" & @CRLF & _
"</ul>"
Local $aArray = StringRegExp($sString, $sRegex, $STR_REGEXPARRAYGLOBALFULLMATCH)
Local $aFullArray[0]
For $i = 0 To UBound($aArray) -1
_ArrayConcatenate($aFullArray, $aArray[$i])
Next
$aArray = $aFullArray
; Present the entire match result
_ArrayDisplay($aArray, "Result")
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for AutoIt, please visit: https://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm