【问题标题】:preg_replace all <img> parameterspreg_replace 所有 <img> 参数
【发布时间】:2013-06-07 11:40:00
【问题描述】:

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

我有一个 preg_replace 函数,我可以在 &lt;img&gt; 周围包裹一个 &lt;a&gt; 标记。

当前的 preg_replace 不再起作用,因为新编辑器在 style 参数中保存了宽度和高度。

预替换:

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

感谢您的宝贵时间 :)

【问题讨论】:

  • 您可以匹配所有元素,进行解析,然后使用原始匹配数组替换旧元素。您只需要使用正则表达式将 preg_match 扩展为几行代码。
  • 您可能需要考虑使用 DOM 解析器而不是正则表达式来处理这类事情。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

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


【解决方案1】:

试试这个:

$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】:

    您可以进一步简化正则表达式,请注意,如果您希望输入正确,则可以使用此解决方案,否则只需使用 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);
    

    说明:

    • &lt;img : 匹配 &lt;img
    • .+? :匹配任何东西一次或多次(不贪心)
    • src=" : 匹配 src="
    • ([^"]*) :匹配除" 之外的任何内容零次或多次并将其分组
    • ".*?/?&gt; :匹配 " ,然后匹配直到 /&gt;&gt;
    • i 修饰符:不区分大小写

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

    Online demo

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 感谢您的回答。我知道我应该改用 DOM 解析器,并且将来会这样做。但就目前而言,Prothid 的回答对我来说是开箱即用的。我注意到了你的建议:)
      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多