基于其InnerHTML替换HTML标记HREF

时间:2015-01-17 18:14:41

标签: php

我正在寻找一种方法来改变它:

...<a href="showinfo:3875//[integer]">[inner content]</a>...

进入这个:

...<a href="http://somelink.com/[inner content]">[inner content]</a>...

上下文与其他showinfo:[integer]值有多个链接a。 (我可以处理那些)

感谢您的帮助, 巴林特

编辑:感谢Kaiser的回答,这是工作片段:

$html = $a;

$dom = new \DOMDocument;
@$dom->loadHTML( $html ); //Cannot guarantee all-valid input

foreach ($dom->getElementsByTagName('a') as $tag) {
    // Fixed strstr order and added a != false check - the, because the string started with the substring
    if ($tag->hasAttribute('href') && strstr($tag->getAttribute('href'), 'showinfo:3875') != false) {
        $tag->setAttribute( 'href', "http://somelink.com/{$tag->textContent}");
        // Assign the Converted HTML, prevents failing when saving
        $html = $tag;
    }
}
return $dom->saveHTML( $dom);
}

1 个答案:

答案 0 :(得分:1)

您可以使用DOMDocument以非常可靠和快速的方式处理DOM节点及其属性等。提示:比(大多数)正则表达式更快,更可靠。

// Your original HTML
$html = '<a href="showinfo:3875//[integer]">[inner content]</a>';

$dom = new \DOMDocument;
$dom->loadHTML( $html );

现在您已准备好DOM,您可以使用DOMDocument方法或DOMXPath搜索它并获取目标元素。

XPath示例:

$xpath = new DOMXpath( $dom );
// Alter the query to your needs
$el = $xpath->query( "/html/body/a[href='showinfo:']" );

或例如使用DOMDocument方法的ID:

// Check what we got so we have something to compare
var_dump( 'BEFORE', $html );

foreach ( $dom->getElementsByTagName( 'a' ) as $tag )
{
    if (
        $tag->hasAttribute( 'href' )
        and stristr( $tag->getAttribute( 'href' ), 'showinfo:3875' )
        )
    {
        $tag->setAttribute( 'href', "http://somelink.com/{$tag->textContent}" );

        // Assign the Converted HTML, prevents failing when saving
        $html = $tag;
    }
}

// Now Save Our Converted HTML;
$html = $dom->saveHTML( $html);

// Check if it worked:
var_dump( 'AFTER', $html );

这很容易。