查找并附加某个类的href

时间:2011-04-13 11:15:09

标签: php xpath append href

我一直在寻找解决方案,但还没找到合适的东西。

情况是这样的: 我需要找到具有给定类(例如class="tracker")的页面上的所有链接,然后在末尾附加查询字符串值,因此当用户加载页面时,这些特定链接会使用一些动态信息进行更新。 / p>

我知道如何使用 Javascript 来完成此操作,但我真的想让它适应运行服务器端。我是 PHP 的新手,但从它的外观来看, XPath 可能就是我正在寻找的但我没有找到合适的例子来开始用。有什么像GetElementByClass

非常感谢任何帮助!

Shadowise

3 个答案:

答案 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&amp;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();