使用domdocument获取如果标签后存在术语的标签的内容 - php

有这个$html

$html = '<p>random</p>
<a href="">Test 1</a> (target1)
<br>
<a href="">Test 2</a>  (target1)
<br>
<a href="">Test 3</a> (skip)
// etc
';

我在$array中有几句话:

$array = array(
    '(target1)',
    '(target2)'
);

如何使用domdocument跳过$html$array中查找所有术语并获取其前面的<a>标记的内容?

因此,我得到以下结果:

$results = array(
    array(
        'text' => 'Test 1',
        'needle' => 'target1'
    ),
    array(
        'text' => 'Test 2',
        'needle' => 'target1'
    )
);

到目前为止我尝试过的

通过以下方法,我设法获取了<a>中所有$html标记的内容:

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="utf-8" ?>' . $html);
$xpath = new DOMXPath($doc);

$elements = $xpath->query('//a'); 
$el_array = array();
if ($elements->length > 0) {
    foreach($elements as $n) {
        $node = trim(strip_tags($n->nodeValue));
        if (!empty($node)) {
            $el_array[] = $node;
        }
    }
    if (!empty($el_array) && is_array($el_array)) {
    print_r($el_array);
    }
}

但是我还没有找到一种方法来获取目标词,以便检查我们是否有匹配项。

参考方案

您可以使用contains和following-sibling创建动态xpath查询。

xpath表达式将是:

//a/following-sibling::text()[contains(., '(target1)') or contains(., '(target2)')]

例如:

$array = array(
    '(target1)',
    '(target2)'
);

$contains =  implode(" or ", array_map(function($x) {
    return "contains(., '$x')";
}, $array));

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="utf-8" ?>' . $html);
$xpath = new DOMXPath($doc);
$elements = $xpath->query("//a/following-sibling::text()[$contains]");
$results = [];

foreach ($elements as $element) {
    $results[] = [$element->previousSibling->nodeValue, trim($element->nodeValue)];
}

print_r($results);

结果:

Array
(
    [0] => Array
        (
            [0] => Test 1
            [1] => (target1)
        )

    [1] => Array
        (
            [0] => Test 2
            [1] => (target2)
        )

)

Demo

PHP PDO组按列名称查询结果 - php

以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…

php:将分钟取整到最近的四分之一小时,然后执行更多操作 - php

最初的问题是这样的:取分钟数->转换为四分之一小时-> 1个四分之一小时为1个单位->输出单位我今天整天都在整理页面,几分钟前我的大脑就停止工作了,我只是不知道如何输出单位数量。我知道在此网站上发布问题会有所帮助。因此,用户输入的分钟数(不是小时和分钟,而是数分钟),站点需要输出单位数量。单位是一个刻钟。分钟总是四舍五入到最近的四分之一小时…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

验证IBAN PHP - php

在设计新平台时,我们尝试集成IBAN编号。我们必须确保IBAN已经过验证,并且存储在数据库中的IBAN始终正确。那么验证数字的正确方法是什么? 参考方案 正如我在其他问题中解释的逻辑一样,我尝试自己创建一个函数。根据Wikipedia文章中解释的逻辑,在下面找到合适的功能。国家特定验证。它适合吗http://en.wikipedia.org/wiki/Int…

PHP:对数组排序 - php

请如何排序以下数组Array ( 'ben' => 1.0, 'ken' => 2.0, 'sam' => 1.5 ) 至Array ( 'ken' => 2.0, 'sam' => 1.5, 'ben' =&…