【问题标题】:preg_replace to put forward slash in IMG tagpreg_replace 在 IMG 标记中提出斜线
【发布时间】:2012-01-18 07:18:00
【问题描述】:

我有以下代码,但它用以下代码替换了每个 img 标签: 我需要替换中包含的所有属性。

例如,这个: <img src="images/myimg.gif" alt="">

应该变成这样: <img src="images/myimg.gif" alt="" />

这是我当前的非工作代码: $html = preg_replace("/<img[^>]+\>/i", "<img $1 />", $html);

【问题讨论】:

    标签: php html regex preg-replace


    【解决方案1】:
    $html = preg_replace("@(<img.*?)(?<!/)>@i", "$1/>", $html); 
    

    【讨论】:

    • 欢迎来到stackoverflow!这个网站应该帮助其他人学习和理解.. 使用消极的后视是一个好主意,我发布了同样的答案。但是您应该在答案中包含一些解释和/或链接。尽管如此,+1 以考虑消极的后视。
    【解决方案2】:

    如果你想使用$1,你首先需要在其中存储一些东西。这是由一个捕获组完成的,这意味着只需在要重用的模式周围加上括号。

    $html = preg_replace("/<img([^>]+)\>/i", "<img $1 />", $html);
    

    您可以使用多种在线工具来测试您的正则表达式,请参阅您的正则表达式,例如here on RegExr

    你可以找到更多关于群组here on regular-expressions.info

    【讨论】:

      【解决方案3】:

      这个正则表达式可能对你有用,但如果重复应用,它会一次又一次地插入/,导致&lt;img ... / / / / /&gt;等等:

      $html = preg_replace("/<img([^>]+)\>/is", "<img \1 />", $html);
      

      为避免这种情况,您可以使用negative lookbehind (?&lt;!\/)

      $html = preg_replace("/<img([^>]+)(?<!\/)\>/is", "<img \1 />", $html);
      

      它只匹配/&gt;关闭的图像标签

      【讨论】:

        【解决方案4】:

        在正则表达式中的属性周围添加括号,然后您可以在替换器中使用 $1:

        $html = preg_replace("/<img([^>]+)\>/i", "<img $1 />", $html);
        

        另见example

        【讨论】:

        • 要有效,图像标签必须具有 alt 属性。所以至少需要一个字符(用 + 而不是 *)。
        • src 也是必需的。但是一个随机字符是不够的。如果您希望此正则表达式仅更改 valid 图像标签,则 srcalt 的前瞻可以达到此目的。但我想在这个用例中验证是多余的。
        猜你喜欢
        • 2014-08-26
        • 1970-01-01
        • 2018-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多