请教一个正则匹配的问题

需求:有这样一个字符串,我需要判断 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();

这是结果

请教一个正则匹配的问题

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
最佳答案
<?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);
4年前 评论
ninscious 4年前
839891627 4年前
讨论数量: 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);
4年前 评论
ninscious 4年前
839891627 4年前
<?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);
4年前 评论

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

file

4年前 评论
____ (作者) (楼主) 4年前

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

4年前 评论
____ (楼主) 4年前

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

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!