preg_replace所有<img/>参数

时间:2013-06-07 11:40:00

标签: php image html-parsing preg-replace preg-match

我已将WYSIWYG编辑器从旧版本升级到最新版本。图像尺寸的保存方式有所不同。旧版本的编辑器用于向图像标记添加宽度和高度参数。新编辑器创建一个样式参数,并将宽度和高度添加为样式。

我使用了preg_replace函数,以便在<a>周围包含<img>标记。

由于新编辑器在样式参数中保存宽度和高度,因此当前的preg_replace不再起作用。

Preg replace:

$Content = preg_replace('#<img(.*?)src="([^"]*/)?(([^"/]*)\.[^"]*)"([^>]*?)>((?!</a>))#', '<a rel="group" class="fancybox fancy" title="" href="$2$3"><img$1src="$2$3"></a>', $Content);

如果要知道,新编辑器会存储如下图像:

<img alt="" src="" style="" />

旧编辑器存储的图像如下:

<img src="" width="404" height="228" alt="" />

如何重构preg_replace以复制完整的样式元素?向后兼容性也很酷。

感谢您的时间:)

3 个答案:

答案 0 :(得分:6)

您可以更多地简化正则表达式,请注意,如果您希望输入正确,则可以使用此解决方案,否则只需使用html解析器:

$string = 'Some text <img alt="bar" title="foo" src="http://example.com/example.jpg" style="width:200px;height:400px;" /> Some text';

$new_string = preg_replace('#<img.+?src="([^"]*)".*?/?>#i', '<a href="$1">$0</a>', $string);
var_dump($new_string);

<强>解释

  • <img:匹配<img
  • .+?:匹配任何一次或多次(ungreedy)
  • src=":匹配src="
  • ([^"]*):匹配除"零次或多次以外的任何内容并将其分组
  • ".*?/?>:匹配",然后是/>>
  • 之前的任何内容
  • i修饰符:匹配大小写不敏感

你可能想要使用<img.+?src\s*=\s*"([^"]*)".*?/?>,你永远不知道=之前和之后可能有空格。

Online demo

答案 1 :(得分:6)

试试这个:

$regex = '#<img([^>]*) src="([^"/]*/?[^".]*\.[^"]*)"([^>]*)>((?!</a>))#';
$replace = '<a rel="group" class="fancybox fancy" title="" href="$2"><img$1 src="$2"$3></a>';
$Content = preg_replace($regex, $replace, $Content);

答案 2 :(得分:2)

正如Spudley在评论中提到的那样,你可以seriously consider a DOM parser(一个快速的谷歌提出了几个选项),特别是如果你无法控制编辑器如何添加图像(尽管修改编辑器以添加链接可能更容易,取决于它是哪一个 - 我个人可能不会试图破解TinyMCE来做这件事,但可能会考虑wysihtml5)。

无论如何,我离题了。使用此方法,尝试尽可能简化正则表达式。您只需将其包装在<a>标记中,而不必担心属性本身是什么(只要保留它们)。

所以尝试这样的事情(我测试了这个表达式,但是在Python中,而不是PHP,所以YMMV):

 preg_replace('<img(.*)src="([^ "]*)"([^>]*)>', '<a href="$2"><img$1src="$2"$3></a>', $whatever_your_string_is);