如何使用PHP DOM扩展(或必要时的其他扩展或库)查找特定节点或属性的偏移量.
例如,假设我有这个HTML文档:
<html><a href="/foo">bar</a></html>
Run Code Online (Sandbox Code Playgroud)
并使用以下代码(进行适当修改):
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
// Find start of $href attribute here
echo $href->something;
}
Run Code Online (Sandbox Code Playgroud)
我希望看到输出15或其他东西,以表明属性从字符15开始进入文档.
似乎有DOMNode::getLineNo()
返回行号的方法- 这与我想要的类似,但我找不到文本中一般偏移的替代方法.
找到你想要的属性后,
$html = <<<HTML
<html><a href="/foo">bar</a></html>
HTML;
$dom = new DOMDocument;
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
$mySecretId = 'abc123';
foreach($nodes as $href) {
$href->value = $mySecretId;
}
$html = $dom->saveHTML();
echo strpos($html, $mySecretId) . "\n";
Run Code Online (Sandbox Code Playgroud)
“ strpos ”将为您提供替换值的第一次出现,这是您想要的位置。
请注意标志“LIBXML_HTML_NOIMPLIED”和“LIBXML_HTML_NODEFDTD”,更多信息请参见此处。
如果要查找匹配元素的所有位置,请执行以下操作:
foreach($nodes as $href) {
$previousValue = $href->value;
$href->value = $mySecretId;
$html = $dom->saveHTML();
echo strpos($html, $mySecretId) . "\n";
$href->value = $previousValue;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
317 次 |
最近记录: |