Regex Replace仅适用于Last Match

Regex Replace only working on Last Match

本文关键字:Last Match 适用于 Replace Regex      更新时间:2023-09-26

我正在尝试用纯文本替换许多图像html元素的src(在浏览器中呈现之前)。

以下是我目前拥有的

var base = './images';
        
var sample = '<p><img src="1.png" alt="image-1"></p><p><img src="2.png" alt="image-1"></p><p><img src="3.png" alt="image-1"></p>';
        
sample = sample.replace(/(<img.+src=")(?!http:'/'/)(.*?)"/g, '$1' + base + '/$2"');
        
$('pre').text(sample);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>

但是,它只替换了最后一个图像元素的src。我在这里错过了什么?

<img.+src中的贪婪匹配捕获第一个img和最后一个src之间的所有内容;因此,您的$1

<img src="1.png" alt="image-1"></p><p><img src="2.png" alt="image-1"></p><p><img src="

更改为非贪婪匹配:

sample = sample.replace(/(<img.+?src=")(?!http:'/'/)(.*?)"/g, '$1' + base + '/$2"');

var base = './images';
        
var sample = '<p><img src="1.png" alt="image-1"></p><p><img src="2.png" alt="image-1"></p><p><img src="3.png" alt="image-1"></p>';
        
sample = sample.replace(/(<img.+?src=")(?!http:'/'/)(.*?)"/g, '$1' + base + '/$2"');
        
$('pre').text(sample);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>

作为注释中的@elcranrs metions,您在这里似乎使用了错误的方法。通过jQuery等在DOM中更改它似乎是一种更合适的方法。

话虽如此,如果出于某种原因,这是解决它的合适方法(我不知道所有的变量),你应该通过使RegEx更明确来解决它。贪婪匹配通常表现最好,必须使用懒惰评估(非贪婪)通常表明您的RegEx不够具体,或者您正在使用RegEx来解决不应该使用RegEx解决的问题。这应该在一定程度上起到了作用:

var base = './images';
        
var sample = '<p><img src="1.png" alt="image-1"></p><p><img src="2.png" alt="image-1"></p><p><img alt="image-1" src="3.png"></p>';
        
sample = sample.replace(/(<img[^>]+src=")(?!http:'/'/)([^"]+)"/g, '$1' + base + '/$2"');
        
$('pre').text(sample);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>

不过,我并不完全确定代码标记是否正确。还在学习使用这些