拆分和替换HTML标记元素

时间:2012-12-11 16:03:31

标签: php html-parsing

我有一个动态标记元素,我需要用PHP替换特定标记。

基本上我只需要标记<a>部分替换<img>和文本。例如:

<a target="_blank" 
   title="Visit MarcAira14 on Facebook" 
   href="http://www.facebook.com/MarcAira14"
>
  <img alt="Facebook icon" src="/sites/all/modules/contrib/socialmedia/icons/levelten/glossy/48x48/facebook.png">
</a>

会变成:

<a target="_blank" 
   title="Visit MarcAira14 on Facebook"
   href="http://www.facebook.com/MarcAira14"
>Facebook</a>

我还需要获取title属性(title="Visit MarcAira14 on Facebook")中的最后一个字符串,在本例中为"Facebook"

任何有想法或建议的人都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

这正是HTML解析器的存在。一种方法是使用PHP自己的DOMDocument

另一种可能更简单的方法是phpQuery,它是围绕DOMDocument的一个很好的包装器。 (似乎它暂时没有更新,但最后一次更新是从2009年5月开始的。)

phpQuery大量借用jQuery,所以如果你熟悉它,可以使用很多已知的概念。

对于你的情况,它应该是这样的:

$doc = phpQuery::newDocument($yourHtmlOrHtmlFragment);

$links = $doc['a[title!=""]:has(img)'];

foreach( $links as $link )
{
    $title = $link->getAttribute('title');
    $words = explode(' ', $title);
    $last_word = end( $words );
    pq($link)->empty()->text( $last_word );
}

另见phpQuery manual

此处讨论了PHP的其他HTML解析器:Robust and Mature HTML Parser for PHP

答案 1 :(得分:0)

这是正则表达式版本。我测试了它,它的工作原理。 text.html是你的源字符串。

<?php

$string = file_get_contents('text.html');
$pattern = "/<img alt=([^<])*/m";
$replacement = 'Facebook';
echo preg_replace($pattern, $replacement, $string);

?>

搜索'&lt; img alt ='然后搜索每个字符,直到第一个'&lt;'并用Facebook取而代之。最后的m意味着搜索多行。