有这个$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' =&…