我一直在寻找解决方案,但还没有找到正确的方法。
情况是这样的:
我需要查找具有给定类(例如class="tracker"
)的页面上的所有链接,然后在末尾附加查询字符串值,因此,当用户加载页面时,这些某些链接会更新一些动态信息。
我知道如何使用Javascript完成此操作,但我真的很想对其进行调整,以运行服务器端。我对PHP还是很陌生,但是从外观上看,XPath可能正是我想要的,但是我还没有找到合适的示例开始。是否有类似GetElementByClass
的东西?
任何帮助将不胜感激!
暗影
最佳答案
是否有类似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>