preg_match和guzzle响应的问题

时间:2017-09-29 08:13:56

标签: php preg-match guzzle

我正在尝试preg_match通过guzzle收到的回复。 问题是当我将其内容输入我的 everything_in_tags 函数时,peg_match函数不会返回任何结果。

当我将 var_dump($ this-> body)的内容手动复制粘贴到 everything_in_tags 函数时,preg_match函数可以正常工作。

施放后$ this-> body是一个字符串对象。

所以现在我想知道为什么它表现得那样,有人会这么善良并告诉我如何解决这个问题。

提前谢谢。

代码:

    <p>
        @using (Html.BeginForm("CharterColumn", "Chart", FormMethod.Get))
        {
            <b>Search by Full Name:</b><font color="black">@Html.DropDownList("Status", new SelectList(ViewBag.Status), new { onchange = "this.form.submit()" })</font>


        }
    </p>

Guzzle-Response as String:

public function __construct() {
  $this->dataRaw = (object) [];
  $this->client = new GuzzleHttp\Client();
  $this->res = $this->client->request('GET', 'https://www-   genesis.destatis.de/genesisWS/web/ExportService_2010?method=TabellenExport&kennung=kennung&passwort=password&namen=13321-0001&bereich=Alle&format=html&strukturinformation=false&komprimieren=true&transponieren=true&startjahr=2016&endjahr=2017&zeitscheiben=&regionalmerkmal=&regionalschluessel=&sachmerkmal=FAMSTD&sachschluessel=VERH&sachmerkmal2=&sachschluessel2=&sachmerkmal3=&sachschluessel3=&stand=&auftrag=false&sprache=de');

  $this->body = (string) $this->res->getBody()->getContents();
  $this->dom = new Dom;

  var_dump($this->body);


  $this->table = $this->everything_in_tags($this->body, 'table', false);

  $this->dom->loadStr($this->table , []);
  $this->html = $this->dom->outerHtml;
}

function everything_in_tags($string, $tagname, $inner) {
  $pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s";
  preg_match($pattern, $string, $matches);
  return $matches[$inner ? 1 : 0];
}

1 个答案:

答案 0 :(得分:0)

我认为Guzzle-Response as String实际上就是你得到的输出,即:当你调用页面时,你的浏览器会向你展示什么。

如果这是正确的,很可能是您不理解从该URL返回的内容。返回的是某种包含xml的xml,就像这样(或类似的东西):

<soapenv:Envelope><soapenv:Body>[content]</soapenv:Body></soapenv:Envelope>

但是,您所针对的内容很可能是html转义的,这意味着:您在浏览器输出中看到的<table>实际上是&lt;table&gt;,因为标记是内容而不是标记。

我的建议是:

  1. 查看浏览器中的实际源代码(右键单击:查看源代码或其他内容),当您输出guzzle响应时,它应包含比您提供的更多的输出。
  2. 使用xml-parser(或SOAP解析器,或任何解析器,不知道这是否真的是rpc)来查找soap-envelope中的内容,然后使用xml解析器来解析该内容。
  3. 这应该足够了。但是,我可能错了。