在DOM属性的文档中查找文本偏移量

Lau*_*ren 6 php dom

如何使用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()返回行号的方法- 这与我想要的类似,但我找不到文本中一般偏移的替代方法.

Jan*_*tis 2

找到你想要的属性后,

  • 将其值替换为您在文档中永远不会看到的唯一值
  • 再次将 DomDocument 转储为 html
  • 搜索字符串中唯一值的位置
$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)