PHP preg_replace替换img标签并在html文本中移动它们

时间:2011-10-14 15:08:45

标签: php preg-replace

我正在开发一个移动网络,其内容来自外国XML,我在使用标签时遇到问题。它们带有样式属性,我认为在显示内容之前使用preg_replace在php中很容易擦除它们。当在文本中找到img标记时会出现问题......类似于:"Hel<img .../>lo My name is Alfred<br/>"。如果我只是擦除了样式属性(通常带有display:float),则图像会破坏文本,使其难以阅读。

我的解决方案是:使用preg_replace,我“清理”所有图片代码,但是我需要抓住这些代码并将它们放在下一个<br/>之后,</p>等等(段落标签的每个最后一个)。我认为它至少会使页面更具可读性和组织性。

问题:不知道如何获取每个img标记的索引,就在我清理它之后,然后找到段落的下一个结尾将其放在那里。

实施例 - &GT;

之前

Hell<img .../>o my name is Alfred.<br/>
<p>I come <img .../>from England</p>

之后:

Hello my name is Alfred<br/>
<img .../>
<p>I come from England</p>
<img .../>

提前致谢。

编辑---

我的疑问是:如果我在文本中找到了img标记(<img />)(也许使用preg_replace,因为我首先需要找到一个img标记,验证其属性并更改它们如果有必要),我如何在整个字符串中获取索引(整个字符串我的意思是整个html文档读取为字符串)所以我可以将整个标记移动到段落的下一端?

1 个答案:

答案 0 :(得分:0)

你不会从任何preg_函数获得匹配的位置。另一方面,您可以使用preg_replace_callback进行替换,然后堆积匹配项以便在之后打印它们。 例如:

function noimages( $match )
{
  $stack = array();
  $img_regex = '%<img.*(/>|</img>)%ixU';
  $noimages = preg_replace_callback($img_regex, 
    function ($imgtag) use(&$stack) { array_push($stack, $imgtag[0]); return ''; },
    $match);
  return array($noimages,$stack);
}

例如:

$match = '<p>I'm not <img src="yyy.jpg"/> interested on this <img src="zzz.jpg"></img> issue </p>';
list($withoutimg, $imgs) = noimages( $match );

将返回$ withoutimg中的块以及$ imgs中包含两个img标记的数组。