2012-12-11 84 views
1

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

基本上我只需要标签<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"

任何人有想法或建议,将不胜感激。

+1

听起来像是一个很好的正则表达式任务 –

+5

听起来像一个很好的DOMDocument任务 –

+1

伟大的辩论! –

回答

0

这是正则表达式版本。我已经测试过它,它工作。 text.html是您的源字符串。

<?php 

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

?> 

它搜索“< IMG ALT =”,然后每一个字符,直到第一个“<”以及与Facebook替换它。末尾的m表示搜索多行。

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