-1

是否可以使用 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>

编辑。根据安迪的建议,查看类似以下内容。仍在为链接转换而苦苦挣扎,但这看起来是一个好的开始。

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);
4

2 回答 2

1

首先,您的 HTML 格式不正确,&需要将其编码为 HTML entity &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);
}

打印

<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>
于 2012-11-29T18:07:54.210 回答
-1

您将需要使用正则表达式。

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

你可以在这里看到正则表达式

于 2012-11-29T17:53:46.550 回答