【问题标题】:PHP preg_replace to replace img tags and move them within html textPHP preg_replace 替换 img 标签并在 html 文本中移动它们
【发布时间】:2011-12-07 20:28:04
【问题描述】:

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

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

问题:不知道如何获取每个img标签的索引,我刚清理完,然后找到下一段的结尾放在那里。

例子-->

之前:

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标签(&lt;img /&gt;)(可能使用preg_replace,因为我首先需要找到一个img标签,验证它的属性并在必要时更改它们),如何获取整个字符串中的索引(通过整个字符串,我的意思是整个 html 文档作为字符串读取),以便我可以获取整个标签并将其移动到段落的下一个结尾?

【问题讨论】:

  • 使用(.+?) 代替...,你就得到了一个正则表达式。稍加努力,就可以在许多重复项中找到一些东西,例如php - Extracting from between two strings using regex,尽管最近许多正则表达式的答案都被搞砸了。
  • 您好,感谢您的回复,但我并不是指正则表达式。我试图说图像标签可以在那里有任何东西(这实际上对我的怀疑并不重要)。我的疑问是:如果我在文本中找到一个 img 标签 (&lt;img /&gt;),我如何在整个字符串中获取索引,以便我可以获取整个标签并将其移动到段落的下一个结尾?
  • 您是一次替换一个段落还是整个文件?

标签: php preg-replace


【解决方案1】:

你不会从任何 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 标签的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2011-11-20
    • 2018-02-03
    相关资源
    最近更新 更多