我已将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以复制完整的样式元素?向后兼容性也很酷。
感谢您的时间:)
答案 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*"([^"]*)".*?/?>
,你永远不知道=
之前和之后可能有空格。
答案 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);