Извлеките желаемое значение атрибута из строки HTML, используя регулярное выражение - PullRequest
1 голос
/ 17 апреля 2019

У меня есть строка HTML, извлеченная из Discourse API с несколькими элементами (p, span, div и т. Д.), И некоторые из них имеют атрибуты, такие как data-time, data-timezone, data-email-preview и т. Д. Я хочу, чтобы значения были в атрибутах data-email-preview, и эти значения являются временными метками вформат enter code here.Эти значения всегда находятся между первыми двумя элементами span внутри строки HTML.Пример строки HTML:

<p><span data-date="2019-05-10" data-time="19:00:00" class="discourse-local-date" data-timezones="Europe/Brussels" data-timezone="Europe/Berlin" data-email-preview="2019-05-10T17:00:00Z UTC">2019-05-10T17:00:00Z</span> → <span data-date="2019-05-10" data-time="22:00:00" class="discourse-local-date" data-timezones="Europe/Brussels" data-timezone="Europe/Berlin" data-email-preview="2019-05-10T20:00:00Z UTC">2019-05-10T20:00:00Z</span><br>
<div class="lightbox-wrapper"><div class="meta">
<span class="filename">HackSpace_by_Sugar_Ray_Banister.jpg</span><span class="informations">1596×771 993 KB</span><span class="expand"></span>
</div></a></div></p>

Мне нужны эти две даты между span извлеченными элементами:

2019-05-10T17:00:00Z и 2019-05-10T20:00:00Z

Ответы [ 4 ]

1 голос
/ 17 апреля 2019

(?<=>)(\d{4}\-\d{2}\-\d{2}T\d{2}\:\d{2}\:\d{2}Z)(?=<\/span>)

Вернет вам необходимые элементы

0 голосов
/ 18 апреля 2019

в VBA что-то в этом роде

Sub Extract2()

    Dim hDoc As MSHTML.HTMLDocument
    Dim hElem As MSHTML.HTMLGenericElement
    Dim sFile As String, lFile As Long
    Dim pat1 As String
    Dim sHtml As String
        strHtml = "c:\1.html"
               'read in the file
                lFile = FreeFile
                sFile = strDir & strHtml
                Open sFile For Input As lFile
                sHtml = Input$(LOF(lFile), lFile)

                'put into an htmldocument object
                Set hDoc = New MSHTML.HTMLDocument
                hDoc.body.innerHTML = sHtml

                Set dateBody = hDoc.getElementsByClassName("discourse-local-date")
                Date1 = dateBody(0).innerText
                Date2 = dateBody(1).innerText
                    MsgBox Date1 & " " & Date2
                'regex
                pat1 = ".*span.*>(.+?)<"
                Date1 = simpleRegex(sHtml, pat1, 0)
                Date2 = simpleRegex(sHtml, pat1, 1)
                    MsgBox Date1 & " " & Date2

End Sub

функция для регулярных выражений

Function simpleRegex(strInput As String, strPattern As String, sNr As Long)
    Dim regEx As New RegExp
    If strPattern <> "" Then
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = True
            .Pattern = strPattern
        End With
        dfs = regEx.Test(strInput)
        If regEx.Test(strInput) Then
            Set sReg = regEx.Execute(strInput)
            simpleRegex = sReg(sNr).SubMatches(0)
        Else
            simpleRegex = "false"
        End If
    End If
End Function
0 голосов
/ 17 апреля 2019

Этого можно добиться с помощью библиотеки HTML DOM, которая находится на github, но я использую sourceforge для загрузки по этой ссылке https://simplehtmldom.sourceforge.io

Используйте его следующим образом

// Create DOM from URL or file
$html = file_get_html('http://www.google.com/');

// Find all images 
foreach($html->find('img') as $element) 
echo $element->src . '<br>';

// Find all links 
foreach($html->find('a') as $element) 
echo $element->href . '<br>';

Вы должны использовать span как

// find('span.data-email-preview')  if not work use  find('date-email-preview')

Если вы хотите использовать preg_replace, это просто, но будет сбивать с толку, потому что есть много значений, поэтому на выходе будет много дат, тогда вам нужно будет создать массив этого вывода, после чего сделайте aloop для просмотра каждой даты в одной строке, чтобы вы могли можно импортировать в базу данных

0 голосов
/ 17 апреля 2019

Может быть, это будет соответствовать вашим потребностям?

https://regex101.com/r/Jo4srA/1

(отредактировано в соответствии с вашими потребностями)

...