查找并追加特定类的href

问题描述

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

解决方法

  有ѭ1这样的东西吗? 这是我提出的一个实现...
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>
    ,  我需要找到页面上的所有链接   给定班级(例如   
class=\"tracker\"
)   [...]   我对PHP相当陌生,但是从   看起来,XPath可能就是我   寻找,但我还没有找到   入门的合适示例。   有什么像   
GetElementByClass
? 此XPath 1.0表达式:
//a[contains(
       concat(\' \',normalize-space(@class),\' \'),\' tracker \'
    )
]
    ,使用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();
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...