LINUX.ORG.RU

regexp - parsing save curl get/post header

 , ,


0

1

Что-то туплю под вечер, подскажите «регулярку» - perl (реализация в xslt 2/3), распарсить «plain-text» заголовка(header), полученного Curl. «Получить каждый пакет»: Пример заголовка:

HTTP/1.1 301 Moved Permanently
Content-Length: 165
Content-Type: text/html
Location: http://gis.bakerhughesdirect.com/RigCounts
Server: Microsoft-IIS/6.0
X-UA-Compatible: IE=EmulateIE7
X-Powered-By: ASP.NET
Date: Sat, 16 Jan 2016 02:11:16 GMT

HTTP/1.1 301 Moved Permanently
Content-Length: 166
Content-Type: text/html
Location: http://gis.bakerhughesdirect.com/RigCounts/
Server: Microsoft-IIS/6.0
X-UA-Compatible: IE=EmulateIE7
X-Powered-By: ASP.NET
Date: Sat, 16 Jan 2016 02:11:16 GMT

HTTP/1.1 200 OK
Date: Sat, 16 Jan 2016 02:11:17 GMT
Server: Microsoft-IIS/6.0
X-UA-Compatible: IE=EmulateIE7
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 7160

Пакет начинается, с HTTP, заканчивается \n\n , что-то типа: (.*\n){8}[\n\n] не подходит, тк 8(число параметров) число не постоянное.
При ^HTTP(\n*.)+ жадный, сожрет сразу все три heder(а будет не жадный сожрет только один).
Еще вариант ^HTTP.*(.*\n){8}, тут опять 8 число параметров, а их число не постоянное
Вообщем туплю под вечер...


Ответ на: комментарий от router

xslt processor - shell утилиты недоступны. Можно конечно через <xsl:analyze-string + tokenize + if/for? , но это еще та реализация получится, хочется красиво, одной строкой :(.


<xsl:analyze-string select="data" regex="\n\n">
  <xsl:matching-substring>

  </xsl:matching-substring>
  <xsl:non-matching-substring>

  </xsl:non-matching-substring>
</xsl:analyze-string>
</code>

Bsplesk
() автор топика
Ответ на: комментарий от Deleted

Спасибо, правда уже «накалякал» свой вариант:
^HTTP.*((\n.+)+)
Возник, еще вопрос, как пропустить первую строку:
Попытался(но это совсем не то, что нужно):
HTTP/1.1 301 Moved Permanently
(?<=H[A-Z].{28}\n).*((\n.+)+)
HTTP/1.1 200 OK
(?<=HTTP/1.1 200 OK\n).*((\n.+)+)
Тоесть, выше для каждого конкретного случая, прибито «гвоздями»(к длине строки), а как сделать универсальный вариант?
В данном случае, не получается заменить H[A-Z].{28}\n или HTTP/1.1 200 OK\n, на что-то вроде HTTP.*\n ? Кто, что подскажет?

Bsplesk
() автор топика
Ответ на: комментарий от Bsplesk

xslt plain_text to xml

Может, кому будет интересно, пример решения на xslt2:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output encoding="utf-8" indent="yes"/> 
    <xsl:template match="curl_post">
        <xsl:comment>Generate(plain_text to xml) request Curl</xsl:comment>
        <headers_response>
            <xsl:apply-templates select="dump[@filename]"/>
        </headers_response>
    </xsl:template>
    <xsl:template match="dump">
        <xsl:variable name="text" select="unparsed-text(@filename, 'UTF-8')"/>
        <xsl:analyze-string select="$text" regex="(HTTP/[^\n]+)((\n.+)+)" flags="m">
            <xsl:matching-substring>
                <header>
                    <xsl:attribute name="req_result"><xsl:value-of select="regex-group(1)" /></xsl:attribute>
                    <xsl:analyze-string select="regex-group(2)" regex="(.+\n)">
                        <xsl:matching-substring>
                            <xsl:analyze-string select="regex-group(1)" regex="(^[^\n]+?):\s(.+$)" flags="m">
                                <xsl:matching-substring>
                                    <xsl:element name="{regex-group(1)}"><xsl:value-of select="regex-group(2)"/></xsl:element>
                                </xsl:matching-substring>
                            </xsl:analyze-string>
                        </xsl:matching-substring>
                    </xsl:analyze-string>
                </header> 
            </xsl:matching-substring>
        </xsl:analyze-string>
    </xsl:template>
</xsl:stylesheet>

<?xml version="1.0" encoding="utf-8"?>
<!--Generate(plain_text to xml) request Curl-->
<headers_response>
   <header req_result="HTTP/1.1 301 Moved Permanently">
      <Content-Length>165</Content-Length>
      <Content-Type>text/html</Content-Type>
      <Location>http://gis.bakerhughesdirect.com/RigCounts</Location>
      <Server>Microsoft-IIS/6.0</Server>
      <X-UA-Compatible>IE=EmulateIE7</X-UA-Compatible>
      <X-Powered-By>ASP.NET</X-Powered-By>
   </header>
   <header req_result="HTTP/1.1 301 Moved Permanently">
      <Content-Length>166</Content-Length>
      <Content-Type>text/html</Content-Type>
      <Location>http://gis.bakerhughesdirect.com/RigCounts/</Location>
      <Server>Microsoft-IIS/6.0</Server>
      <X-UA-Compatible>IE=EmulateIE7</X-UA-Compatible>
      <X-Powered-By>ASP.NET</X-Powered-By>
   </header>
   <header req_result="HTTP/1.1 200 OK">
      <Date>Sat, 16 Jan 2016 02:11:17 GMT</Date>
      <Server>Microsoft-IIS/6.0</Server>
      <X-UA-Compatible>IE=EmulateIE7</X-UA-Compatible>
      <X-Powered-By>ASP.NET</X-Powered-By>
      <X-AspNet-Version>2.0.50727</X-AspNet-Version>
      <Set-Cookie>ASP.NET_SessionId=iuh0rd45kqdqmq45zepm0fyi; path=/; HttpOnly</Set-Cookie>
      <Cache-Control>private</Cache-Control>
      <Content-Type>text/html; charset=utf-8</Content-Type>
   </header>
</headers_response>

Bsplesk
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.