首页 > 解决方案 > 如何通过在 php 中知道其 innerhtml 来获得字符串输出?

问题描述

我正在尝试获取<span>包含文本“Bonkers”的元素之间产生的字符串结构。

例如:

  <span>    Bonkers </span> 

或者

 <span>    Bonkers           </span> 

或者

<span>              Bonkers                          </span>

问题是我不知道跨度结构,但我知道“疯子”会在那里。

我想返回整个文本字符串结构(包括 <span> 打开和关闭标签,以便稍后我可以替换它。例如:

$spanwithbonkers  = '<span>      Bonkers                      </span>';

到目前为止,这就是我所拥有的,但它不起作用:

 <?php

 $homepage = file_get_contents('http://www.example.com/');

  preg_match('/^<span>^Bonkers^</span>/', $homepage, $matches);

  $spanwithbonkers = $matches[0]);


?>

不确定是否应该使用 preg_match。

标签: phphtmlregexwordpresspreg-match

解决方案


比使用正则表达式解析 HTML 更好的方法是使用DOMDocumentandDOMXPath类。您可以将 HTML 加载到文档中,然后使用 XPath 查找特定元素,然后处理这些元素。在您的情况下,我们Bonkers通过比较text每个跨度节点的值来找到包括单词的跨度,例如

$html = '<body><div><div><span id="b">    Bonkers  </span></div></div>
         <div><span> no bonk</span>
              <span> This is bonkers!</span>
         </div></body>';
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$spans = $xpath->query("//span[contains(text(), 'Bonkers')]");
foreach ($spans as $span) {
    echo $span->C14N();
}

输出:

<span id="b"> Bonkers </span>

如果要进行不区分大小写的比较,则要复杂一些:

$spans = $xpath->query('//span');
foreach ($spans as $span) {
    if (stripos($span->textContent, 'Bonkers') !== false) {
        echo $span->C14N() . "\n";
    }
}

输出

<span id="b"> Bonkers </span> 
<span> This is bonkers!</span>

3v4l.org 上的演示


推荐阅读