Что нового

[RegExp] StringRegExp получить содержимое тэга с исключением вложенных тэгов

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Есть html-файл, пытаюсь получить содержимое заголовков <h1> одним регэкспом.
Примеры заголовков(в файле может быть любой из них или все сразу ;)):
Код:
$sHTML = '<h1>Заголовок заголовок</h1>'
$sHTML = '<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'
$sHTML = '<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'

На выходе нужен текст заголовка без тегов <strong> & </strong>
Мои потуги:
Код:
#include <Array.au3>
$sHTML = '<h1>Заголовок заголовок</h1>'
;~ $sHTML = '<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'
;~ $sHTML = '<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'
$aHeaders = StringRegExp($sHTML, '<h1.*?>(?:<strong>)*(.+?)(?:</strong>)*</h1>', 3)
_ArrayDisplay($aHeaders)

Работает только с первым и вторым примером.
По идее нужно каким-то способом повторить конструкцию (?:<strong>)*(.+?)(?:</strong>)*
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Код:
;~ $sHTML = '<h1>Заголовок заголовок</h1>'
;~ $sHTML = '<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'
$sHTML = '<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'
$aHeaders = StringRegExp($sHTML, '<h1.*?>(?:.*>)?(.+?)(?:<.*)?</h1>', 3)
_ArrayDisplay($aHeaders)


У меня получилось так.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
А так : ?
Код:
$sHTML = '<h1>Заголовок заголовок</h1>' & @LF & _
'<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'& @LF & _ 
'<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'
;$sHeader = StringRegExpReplace($sHTML,"(?:</strong>)?<.+?>(?:<strong>)?","") 
$sHeader = StringRegExpReplace($sHTML,"(?:</.+?>)?<.+?>(?:<.+?>)?","") ; Даже так
ConsoleWrite($sHeader& @LF)


Единственное надо предварительноо выявить текст заголовка : (Присутствие тега <h1>)



Добавлено:
Сообщение автоматически объединено:

Приходится делать за 2 прохода :
Код:
$sHTML = '<h1>Заголовок заголовок</h1>' & @LF & _
'<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'& @LF & _ 
'<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'
$sHeader = StringRegExpReplace(StringRegExpReplace($sHTML,"<h1.*?>(.+?)</h1>","\1"),"<.+?>","")
ConsoleWrite($sHeader& @LF)
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
gregaz [?]
$sHeader = StringRegExpReplace($sHTML,"(?:</.+?>)?<.+?>(?:<.+?>)?","") ; Даже так
Очень познавательно, но если между двумя заголовками попадутся другие вложения, а документ состоит не только из заголовков :D, то они тоже попадают под Replace.
Код:
$sHTML = '<h1>Заголовок заголовок</h1>' & @LF & _
'<h1 class="tzag"><strong>Заголовок заголовок</strong></h1> <p>aaaaaaaaa</p>'& @LF & _
'<h1><strong>Заголовок</strong><strong> заголовок</strong></h1> <p>aaaaaaaaa</p>' & @LF
;~ $sHeader = StringRegExpReplace(StringRegExpReplace($sHTML,"(?s)<h1.*?>(.+?)</h1>","\1"),"<.+?>","")
$sHeader = StringRegExpReplace($sHTML,"(?:</.+?>)?<.+?>(?:<.+?>)?","")
ConsoleWrite($sHeader& @LF)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Redline [?]
если между двумя заголовками попадутся другие вложения, а документ состоит не только из заголовков
, то они тоже попадают под Replace.
Тогда так :
Код:
#include <array.au3>
$sHTML = '<h1>Заголовок заголовок</h1>' & @LF & _
'<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'& @LF & _ 
'aaaaaaaaaaaaaaaaaaaaaaaa'& @LF & _ 
'<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'& @LF & _ 
'<strong>Заголовок</strong><strong> заголовок</strong>'

$aHeader = StringRegExp($sHTML,"<h1.*?>(.+?)</h1>",3)
_ArrayDisplay($aHeader)
For $i=1 To UBound($aHeader)-1
	$aHeader[$i]=StringRegExpReplace($aHeader[$i],"<.+?>","")
Next
_ArrayDisplay($aHeader
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 401
gregaz [?]
Цикл в таком случае не нужен:

Код:
$aHeader = StringRegExpReplace($sHTML, "</?[^h\d+]{2}.+?>", "")
$aHeader = StringRegExp($aHeader, "<h\d+.*?>(.*)</h\d+>", 3)

_ArrayDisplay($aHeader)
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
Действительно .

Кстати получил я без массива вот так :

Код:
$sHTML = 'aaaaaaaaaaaaaaa' & @LF & _
'<h1>Заголовок заголовок</h1>'& @LF & _ 
'bbbbbbbbbbbbbbbbb'& @LF & _ 
'<h1 class="tzag"><strong>Заголовок заголовок</strong></h1>'& @LF & _ 
'ccccccccccccccc'& @LF & _ 
'<h1><strong>Заголовок</strong><strong> заголовок</strong></h1>'& @LF & _ 
'ddddddddddddddddddddddd'& @LF & _ 
'<strong>Заголовок</strong><strong> заголовок</strong>'

$sHeader=StringRegExpReplace(StringRegExpReplace($sHTML,"(?s)(^|</h1>).*?(<h1.*?>|$)", @CRLF),"<.+?>","")

ConsoleWrite($sHeader& @LF)
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
gregaz [?]
У меня было похожее решение:
Код:
$aHeaders = StringRegExp($sHTML, '(?s)<h1.*?>(.+?)</h', 3)
For $l = 0 To UBound($aHeaders) - 1
	$aHeaders[$l] = StringRegExpReplace($aHeaders[$l], '<.+?>', '')
Next


CreatoR [?]
Цикл в таком случае не нужен:
Переделал под себя, чтобы ненужные теги не перелопачивать + исключить теги типа h2 h3 ...:
Код:
$aHeaders = StringRegExpReplace($sHTML, '</?strong>', '')
$aHeaders = StringRegExp($aHeaders, '(?s)<h1.*?>(.+?)</h', 3)
_ArrayDisplay($aHeaders)

Решение в одно действие так и не нашлось. Закрываю.
 
Верх