【问题标题】:Extract and replace all images from paragraph从段落中提取和替换所有图像
【发布时间】:2016-02-03 21:58:00
【问题描述】:

我有这个 html 内容:

<p><img src="##" />
</p>
<p>

<img src="##" />
</p>
<p>
</p>
<p class="ss"><a href="ss">
    <img src="####" />
</a></p>

我想提取所有段落及其所有图像并重新格式化 html,以便我可以先有图像,然后是以下段落,这是一个示例:

<img src="##" /><p>
</p>
<img src="##" />
<p>


</p>
<p>
</p>
<img src="####" />
<p class="ss"><a href="ss">

</a></p>

我尝试了一些方法,但它不起作用:

$result = preg_replace('/(<p\b[^><]*)>(.+?)(<img([^>]*)\/>)(.+?)(<\/p>)/is', '$2 $4', $text);

【问题讨论】:

  • 使用 html 解析器很难做到这一点,更不用说使用正则表达式了。
  • 这就是我想要的,只有正则表达式
  • 为什么要坚持正则表达式?使用SimpleXML 会更容易。

标签: php regex html-parsing


【解决方案1】:

这是非常粗略的,可能会比你想要的更多,但在非常简单的场景中,这可能会起作用:

$result = preg_replace('/(<p[^>]*>)(.*?)(<img[^>]*>)/is', '$3$1$2', $text);

这可能更好:

$result = preg_replace('/(<p[^>]*>)([^<]*)(<img[^>]*>)/is', '$3$1$2', $text);

【讨论】:

  • 似乎按照我的设计方式工作。嵌套时并不意味着拉 img 标签。它可以,但它也会错误地提取一些它不应该的图像。我根据 OP 的示例做出的假设是 img 标签将立即跟随 p 标签打开,我只拉那些。在您的示例中,您从锚标记中拉出了一个 img 标记,这将导致锚无用并且 img 无法点击。
  • 在这种情况下,您可能希望将锚标签和 img 标签都从 p 中拉出,但这不是他所要求的——为了安全而不是去破坏当出现未定义的情况时的来源。
【解决方案2】:

这对我有用,它会查找包含任何内容和图像的每个段落,因此我可以匹配所有图像及其包含的段落。

$pattern = '/(<p\b[^><]*>)(((?!<\/p>).?)*)(<img.*?\/\>)(((?!<\/p>).?)*)(<\/p>)/s';

【讨论】:

  • 很好。愿意解释一下它的作用吗?
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多