5

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

我有一个我使用的 preg_replace 函数,以便我可以<a><img>.

当前的 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 以复制完整的样式元素?向后兼容也会很酷。

谢谢你的时间 :)

4

3 回答 3

8

尝试这个:

$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);
于 2013-06-07T16:50:33.357 回答
7

您可以进一步简化正则表达式,请注意,如果您希望输入正确,则可以使用此解决方案,否则只需使用 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
  • .+?:匹配任何东西一次或多次(不贪婪)
  • src=": 匹配src="
  • ([^"]*):匹配除"零次或多次以外的任何内容并将其分组
  • ".*?/?>: 匹配",然后是任何东西,直到/>>
  • i修饰符:匹配不区分大小写

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

在线演示

于 2013-06-07T16:46:00.493 回答
2

正如 Spudley 在他的评论中提到的那样,您可能会认真考虑使用 DOM 解析器(快速的 Google 会出现几个选项),特别是如果您无法控制编辑器如何添加图像(尽管修改编辑器以添加链接可能更容易,取决于它是哪一个——我个人可能不会尝试破解TinyMCE来做到这一点,但可能会考虑将它用于wysihtml5)。

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

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

 preg_replace('<img(.*)src="([^ "]*)"([^>]*)>', '<a href="$2"><img$1src="$2"$3></a>', $whatever_your_string_is);
于 2013-06-07T16:46:45.433 回答