我正在寻找一种方法来改变它:
...<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);
}
答案 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 );
这很容易。