用php修改html属性

时间:2013-04-21 01:43:31

标签: php dom

我有一个html字符串,其中只包含一个a元素。例如:

   <a href="http://www.test.com" rel="nofollow external">test</a>

在php中我必须测试 rel 是否包含 external ,如果是,则修改 href 并保存字符串。

我已经找了DOM节点和对象。但是它们似乎对于只有一个A元素来说太多了,因为我必须迭代才能获得html节点,而我不知道如何测试 rel 是否存在且包含 external

$html = new DOMDocument();
$html->loadHtml($txt);
$a = $html->getElementsByTagName('a');
$attr = $a->item(0)->attributes();
...

此时我将得到似乎是开销的NodeMapList。有没有更简单的方法,或者我应该用DOM做什么?

4 个答案:

答案 0 :(得分:10)

有没有更简单的方法,或者我应该用DOM做什么?

使用DOM。

以下是一个例子:

<?php
$html = '<a href="http://example.com" rel="nofollow external">test</a>';
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//a[contains(concat(' ', normalize-space(@rel), ' '), ' external ')]");
foreach($nodes as $node) {
    $node->setAttribute('href', 'http://example.org');
}
echo $dom->saveHTML();

答案 1 :(得分:2)

我一直在用DOM修改。这就是我得到的:

$html = new DOMDocument();
$html->loadHtml('<?xml encoding="utf-8" ?>' . $txt);
$nodes = $html->getElementsByTagName('a');
foreach ($nodes as $node) {
    foreach ($node->attributes as $att) {
        if ($att->name == 'rel') {
            if (strpos($att->value, 'external')) {
                $node->setAttribute('href','modified_url_goes_here');
            }
        }
    }
}
$txt = $html->saveHTML();

我不想为这一个字符串加载任何其他库。

答案 2 :(得分:1)

最好的方法是使用HTML解析器/ DOM,但这是一个正则表达式解决方案:

$html = '<a href="http://www.test.com" rel="nofollow external">test</a><br>
<p> Some text</p>
<a href="http://test.com">test2</a><br>
<a rel="external">test3</a> <-- This won\'t work since there is no href in it.
';

$new = preg_replace_callback('/<a.+?rel\s*=\s*"([^"]*)"[^>]*>/i', function($m){
    if(strpos($m[1], 'external') !== false){
        $m[0] = preg_replace('/href\s*=\s*(("[^"]*")|(\'[^\']*\'))/i', 'href="http://example.com"', $m[0]);
    }
    return $m[0];
}, $html);

echo $new;

Online demo

答案 3 :(得分:0)

您可以使用正则表达式 if it matches /\s+rel\s*=\s*".*external.*"/ 然后做一个regExp替换之类的 /(<a.*href\s*=\s*")([^"]\)("[^>]*>)/\1[your new href here]\3/

虽然使用可以为你做这种事情的库更容易(比如javascript javascript)