转换HTML以使用PHP显示链接URL

时间:2012-11-29 17:42:42

标签: php regex html-parsing

是否可以使用PHP将第一个块转换为第二个文本块?如果是这样,怎么样?感谢

<div>
 <p>Some text & a <a href="http://abc.com/index.php?x=123&y=abc">link</a>. Done</p>
 <p>More text & a <a href="http://abc.com/index.php?x=123&y=abc">link</a>. Done</p>
</div>


<div>
 <p>Some text & a <strong>link</strong> <i>(http://abc.com/index.php?x=123&y=abc)</i>. Done</p>
 <p>More text & a <strong>link</strong> <i>(http://abc.com/index.php?x=123&y=abc)</i>. Done</p>
</div>

EDIT。 Per Andy的建议,看下面的内容。仍然在转换链接方面苦苦挣扎,但这似乎是一个良好的开端。

libxml_use_internal_errors(true);   //Temporarily disable errors resulting from improperly formed HTML
$doc = new DOMDocument();
$doc->loadHTML($array['message_text']);
$a = $doc->getElementsByTagName('a');
foreach ($a as $link)
{
    //Where do I go from here?
}
$array['message_text'] = $doc->saveHTML();
libxml_use_internal_errors(false);

2 个答案:

答案 0 :(得分:1)

首先,您的HTML格式不正确,因为&需要编码为HTML实体&amp;。解决这个问题让我们:

$html = '<div>
 <p>Some text &amp; a <a href="http://abc.com/index.php?x=123&amp;y=abc">link</a>. Done</p>
 <p>More text &amp; a <a href="http://abc.com/index.php?x=123&amp;y=abc">link</a>. Done</p>
</div>';

从这里开始,你不应该使用正则表达式。它非常脆弱,不适合解析HTML。相反,您可以使用PHP的DOMDocument类来解析HTML,提取<a>标记,从中提取所需信息,创建新的HTML元素,并将它们插入适当的位置。

$doc = new DOMDocument;
$doc->loadHTML( $html);

$xpath = new DOMXPath($doc);
foreach( $xpath->query( '//a') as $a) {
    $strong = $doc->createElement( 'strong', $a->textContent);
    $i = $doc->createElement( 'i', htmlentities( $a->getAttribute('href')));
    $a->parentNode->insertBefore( $strong, $a);
    $a->parentNode->insertBefore( $i, $a);
    $a->parentNode->removeChild( $a);
}

prints

<p>Some text &amp; a <strong>link</strong><i>http://abc.com/index.php?x=123&amp;y=abc</i>. Done</p> 
<p>More text &amp; a <strong>link</strong><i>http://abc.com/index.php?x=123&amp;y=abc</i>. Done</p>

答案 1 :(得分:-1)

您需要使用正则表达式。

$newHtml = preg_replace(/<a[\s\w"'=\t\n]*href="(.*?)"[\s\w"'=\t\n]*>(.*?)<\/a>/i, "<strong>${2}</strong> <i>${1}</i>", $html);

您可以看到正则表达式here