是否可以使用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);
答案 0 :(得分:1)
首先,您的HTML格式不正确,因为&
需要编码为HTML实体&
。解决这个问题让我们:
$html = '<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>';
从这里开始,你不应该使用正则表达式。它非常脆弱,不适合解析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 & 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>
答案 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