简单的html dom:通过匹配标签内的文本来查找元素

时间:2020-10-02 14:56:36

标签: php html dom simple-html-dom

我喜欢找到没有类或ID的特定h4标签。我想在其中找到h4文本标记:
如您在下面看到的,h4标签位于块标签内,但每个产品的块标签编号均不同,例如其中一些没有价格。因此,如果我这样做$html->find('block[2]'),如果没有任何价格,它就会为我显示颜色。
所以我想说h4 inner text = 'Price:'是否显示$2,163标记内的.block。好?

目标HTML:

<div class="article" id="article">

    <div class="block">
        <h4>First name and last name:</h4>
         name name
     </div>

     <div class="block">
         <h4>Price:</h4>
          $2,163
           <span>(50% off)</span>
     </div>

     <div class="block">
          <h4>Color:</h4>
           black,
           <span>and white</span>
     </div>

     <div class="block">
           <h4>Date:</h4> 2020
     </div>
              
     <div class="block">
          <h4>Time:</h4>
          <time datetime="12">12 clock</time>
     </div>
</div>

我的PHP:

$html = file_get_html("$url");

foreach ($html->find('#article') as $ret) {
    foreach ($ret->find('.block') as $pa) {
        foreach ($pa->find('h4') as $e) {
            if (strpos($e->innerhtml, "Price:") !== FALSE) {
                $str = $e->innerhtml;
                $price = $str->parent()->innertext;
                //$price = $str->plaintext;
                echo $price;
            }
        }
    }
}

我想检查<h4>Price:<h4>是否存在,然后显示.block内容,而不显示h4。
但我什么也没得到。
我的英语很抱歉

1 个答案:

答案 0 :(得分:1)

您可以使用如下功能。它在具有<h4> ID的元素中的block类的元素中寻找任何article,然后检查其文本。如果匹配,它将删除标题并返回块中剩余内容的文本:

function findValue($html, string $key): ?string
{
    foreach ($html->find('#article .block h4') as $h4) {
        if ($h4->innertext() === "{$key}:") {
            $h4 = clone $h4;  // to prevent altering the document
            $block = $h4->parent();
            $block->removeChild($h4);

            return $block->text();
        }
    }

    return null;
}

用法:

echo findValue($html, 'First name and last name'), PHP_EOL;  // name name
echo findValue($html, 'Price'), PHP_EOL;                     // $2,163 (50% off)
echo findValue($html, 'Color'), PHP_EOL;                     // black, and white
echo findValue($html, 'Date'), PHP_EOL;                      // 2020
echo findValue($html, 'Time'), PHP_EOL;                      // 12 clock