我一直在寻找解决方案,但还没找到合适的东西。
情况是这样的:
我需要找到具有给定类(例如class="tracker"
)的页面上的所有链接,然后在末尾附加查询字符串值,因此当用户加载页面时,这些特定链接会使用一些动态信息进行更新。 / p>
我知道如何使用 Javascript 来完成此操作,但我真的想让它适应运行服务器端。我是 PHP 的新手,但从它的外观来看, XPath 可能就是我正在寻找的但我没有找到合适的例子来开始用。有什么像GetElementByClass
?
非常感谢任何帮助!
Shadowise
答案 0 :(得分:3)
有
GetElementByClass
吗?
这是我掀起的一个实现......
function getElementsByClassName(DOMDocument $domNode, $className) {
$elements = $domNode->getElementsByTagName('*');
$matches = array();
foreach($elements as $element) {
if ( ! $element->hasAttribute('class')) {
continue;
}
$classes = preg_split('/\s+/', $element->getAttribute('class'));
if ( ! in_array($className, $classes)) {
continue;
}
$matches[] = $element;
}
return $matches;
}
此版本不依赖于上面的帮助函数。
$str = '<body>
<a href="">a</a>
<a href="http://example.com" class="tracker">a</a>
<a href="http://example.com?hello" class="tracker">a</a>
<a href="">a</a>
</body>
';
$dom = new DOMDocument;
$dom->loadHTML($str);
$anchors = $dom->getElementsByTagName('body')->item(0)->getElementsByTagName('a');
foreach($anchors as $anchor) {
if ( ! $anchor->hasAttribute('class')) {
continue;
}
$classes = preg_split('/\s+/', $anchor->getAttribute('class'));
if ( ! in_array('tracker', $classes)) {
continue;
}
$href = $anchor->getAttribute('href');
$url = parse_url($href);
$attach = 'stackoverflow=true';
if (isset($url['query'])) {
$href .= '&' . $attach;
} else {
$href .= '?' . $attach;
}
$anchor->setAttribute('href', $href);
}
echo $dom->saveHTML();
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<a href="">a</a>
<a href="http://example.com?stackoverflow=true" class="tracker">a</a>
<a href="http://example.com?hello&stackoverflow=true" class="tracker">a</a>
<a href="">a</a>
</body></html>
答案 1 :(得分:2)
我需要找到页面上的所有链接 给定一个班级(比方说
class="tracker"
) [...] 我对 PHP 很新,但是来自 看起来, XPath 可能就是我的意思 寻找,但我还没找到 开始的合适例子。 有没有像GetElementByClass
?
此XPath 1.0表达式:
//a[contains(
concat(' ',normalize-space(@class),' '),
' tracker '
)
]
答案 2 :(得分:0)
稍微短一点,使用xpath:
$dom = new DomDocument();
$dom->loadXml('<?xml version="1.0" encoding="UTF-8" ?>
<root>
<a href="somlink" class="tracker foo">label</a>
<a href="somlink" class="foo">label</a>
<a href="somlink">label</a>
<a href="somlink" class="atrackerb">label</a>
<a href="somlink">label</a>
<a href="somlink" class="tracker">label</a>
<a href="somlink" class="tracker">label</a>
</root>');
$xpath = new DomXPath($dom);
foreach ($xpath->query('//a[contains(@class, "tracker")]') as $node) {
if (preg_match('/\btracker\b/', $node->getAttribute('class'))) {
$node->setAttribute(
'href',
$node->getAttribute('href') . '#some_extra'
);
}
}
header('Content-Type: text/xml; charset"UTF-8"');
echo $dom->saveXml();