【问题标题】:grab text in the middle to a variable [duplicate]将中间的文本抓取到变量中[重复]
【发布时间】:2013-01-10 07:50:35
【问题描述】:

可能重复:
PHP DOMDocument - get html source of BODY

我有以下代码作为变量,并试图抓住正文标签之间的所有内容(同时保留 p 标签等)。这样做的最佳方法是什么?

  • 预赛
  • strpos / substr

    <head>
    <title></title>
    </head>
    <body>
        <p>Services Calls2</p>
    </body>
    

【问题讨论】:

    标签: php


    【解决方案1】:

    两者都不是。您可以使用 XML 解析器,例如 DomDocument:

    $dom = new DOMDocument();
    $dom->loadHTML($var);
    
    $body = $dom->getElementsByTagName('body')->item(0);
    
    $content = '';
    
    foreach($body->childNodes as $child)
      $content .= $dom->saveXML($child);
    

    【讨论】:

    • 这很好,但我得到 添加了新变量的开始和结束。我该如何删除它。
    • 这不会在整个中递归,它只会获取第一级标签。 (虽然不是 -1 的原因,仍然是正确的方法,只是需要更多代码:)
    • 我认为这是一种获取小数据的相当慢的方法,因为 DomDocument 使用 DOM Parser,它首先读取整个文档。 "表示整个 HTML 或 XML 文档;"来自文档
    • @Lilleman:这不是真的,标签的内容也会被获取
    • @user112570:这似乎是 Windows 上换行符的一部分。在将字符串传递给解析器之前尝试规范化字符串中的新行,例如$var = str_replace("\r\n", "\n", $var);
    【解决方案2】:

    试试这个,$html 有文字:

    $s = strpos($html, '<body>') + strlen('<body>');
    $f = '</body>';
    
    echo trim(substr($html, $s, strpos($html, $f) - $s));
    

    【讨论】:

    • 如果使用strrpos('&lt;/body&gt;')来获取结束标签位置会更可靠
    【解决方案3】:

    我建议你使用 preg_match 因为&lt;p&gt;Services Calls2&lt;/p&gt; 之间的内容可以一直改变,然后 subtr 或 strpos 将需要相当有争议的代码。

    例子:

    $a = '<h2><p>Services Calls2</p></h2>';
    preg_match("/<p>(?:\w|\s|\d)+<\/p>/", $a, $ar);
    var_dump($ar);
    

    正则表达式将只允许字母、空格和数字。

    【讨论】:

    • 我认为 preg_match 不是解析的方法
    猜你喜欢
    • 2012-10-30
    • 2018-10-13
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2021-08-08
    • 1970-01-01
    相关资源
    最近更新 更多