请教一个正则匹配的问题

需求:有这样一个字符串,我需要判断 img 标签的 src 中是否有 .jpg 或者 .png 后缀,没有则加上。
原先想用正则一步到位,但是实现起来好像不太乐观。
于是分了很多步操作。想请教更好的解决方法!
以下是我的代码

<?php
    header("Content-type: text/html; charset=utf-8");

    $str = '<img src=\"https://www.test.com/test1\" alt=\"test1\" />
    <img src=\"https://www.test.com/test2.png\" alt=\"test2\" />
   dmaslkfqwen faslmdasl
    <img src=\"https://www.test.com/test3.jpg\" alt=\"test3\" />
      <img src=\"https://www.test.com/test4.jpg\" alt=\"test4\" />
        <img src=\"https://www.test.com/test14\" alt=\"test14\" />
          <img src=\"https://www.test.com/test5.jpg\" alt=\"test5\" />
    123ff';

    $pattern1 = '/<img.+src=\\\[\"|\']?(.+\.(jpg|png))\"?.+>/i';
    $pattern2 = '/<img.*?src=\\\[\"|\']?(.*?)\\\[\"|\']?\s.*?>/i';

    preg_match_all($pattern1, $str, $images1);
    preg_match_all($pattern2, $str, $images2);

    $new_arr = array_merge(array_diff($images1[1], $images2[1]),array_diff($images2[1], $images1[1]));

    foreach ($new_arr as $key => $arr) {
        $search = '\\"' . $arr . '\\';
        $replace = '\\"' . $arr . '.jpg\\';

        $str = str_replace($search, $replace, $str);
    }
    echo '<pre>';
    var_dump($str);
    exit();

这是结果

请教一个正则匹配的问题

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
小李世界
最佳答案
<?php
    $str = '<img src="https://www.test.com/test1" alt="test1" />
    <img src="https://www.test.com/test2.png" alt="test2" />
 dmaslkfqwen faslmdasl
    <img src="https://www.test.com/test3.jpg" alt="test3" />
        <img src="https://www.test.com/test4.jpg" alt="test4" />
            <img src="https://www.test.com/test14" alt="test14"/>
                <img style="width:233px" src="https://www.test.com/你好.jpg" />
    123ff';

echo preg_replace('/(<img.*?src=".+?\/\w+)\"/', '$1.jpg"', $str);
10个月前 评论
ninscious 10个月前
839891627 10个月前
讨论数量: 5
小李世界
<?php
    $str = '<img src="https://www.test.com/test1" alt="test1" />
    <img src="https://www.test.com/test2.png" alt="test2" />
 dmaslkfqwen faslmdasl
    <img src="https://www.test.com/test3.jpg" alt="test3" />
        <img src="https://www.test.com/test4.jpg" alt="test4" />
            <img src="https://www.test.com/test14" alt="test14"/>
                <img style="width:233px" src="https://www.test.com/你好.jpg" />
    123ff';

echo preg_replace('/(<img.*?src=".+?\/\w+)\"/', '$1.jpg"', $str);
10个月前 评论
ninscious 10个月前
839891627 10个月前

@likunyan 很帅,谢谢!但是有点小问题也是一直困扰我的, 为什么这个正则会匹配出 alt 里的内容呢?

file

10个月前 评论
____ (作者) (楼主) 10个月前

preg_replace_callback('/<img src=\["\'](.+?\/[a-zA-Z0-9]+)\\/', function($a) { return $a[0] . ".jpeg" ; }, $ss)

10个月前 评论
____ (楼主) 10个月前
小李世界
<?php
    $str = '<img src="https://www.test.com/test1" alt="test1" />
    <img src="https://www.test.com/test2.png" alt="test2" />
 dmaslkfqwen faslmdasl
    <img src="https://www.test.com/test3.jpg" alt="test3" />
        <img src="https://www.test.com/test4.jpg" alt="test4" />
            <img src="https://www.test.com/test14" alt="test14"/>
                <img style="width:233px" src="https://www.test.com/你好.jpg" />
    123ff';

echo preg_replace('/(<img.*?src=".+?\/\w+)\"/', '$1.jpg"', $str);
10个月前 评论

这个应该可以用,虽然有点复杂

preg_replace('/<img(?:.(?<!<))*?(src="(?:.(?<! ))*?(?<![\.png|\.jpg]))"/', '$1.jpg', $str);
10个月前 评论
小李世界 10个月前
____ (楼主) 10个月前
anniversary (作者) 10个月前
____ (楼主) 10个月前
anniversary (作者) 10个月前
____ (楼主) 10个月前

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!