2016-03-04 118 views
0

我正在使用正则表达式来替换HTML文件中的图像源URL。如果不是正则表达式匹配字符串

我想例如与<?= $folder ?>/img/

问题更换img/: 当我运行的正则表达式多次,它会再次更换img/,创建:

<?= $folder ?>/<?= $folder ?>/img 

..和等。有没有办法告诉正则表达式来取代img/如果不是<?= $folder ?>/img

我想/^(?:(?!<?= $folder ?>/img).)*$/但不知道如何首先匹配,并检查它没有包含<?= $folder ?>/img

+0

我不知道这将是清洁一下,但你可以首先用'[PLACEHOLDER]'替换完整的字符串,然后进行替换,然后再用完整的字符串替换'[PLACEHOLDER]'。我相信你可以用一个正则表达式来替换,但这种方法可能是一种更线性的替代方法。 –

+0

@anubhava我已更新我的问题 – CyberJunkie

+0

为什么你使用正则表达式呢?你只需要做一个查找和替换。 – Mikey

回答

2

如果你喜欢的正则表达式,请尝试:

function matchIfNot(str) { 
 
    var newstr = str.replace(/^(?!(<\?=\s\$folder\s\?>\/))(img\/)/g, "<?= $folder ?>/img/") 
 
    alert("Old string: " + str + "\nNew string: " + newstr) 
 
} 
 

 
matchIfNot("<?= $folder ?>/img/") 
 
matchIfNot("img/")

输出:

Old string: <?= $folder ?>/img/ 
New string: <?= $folder ?>/img/ 

Old string: img/ 
New string: <?= $folder ?>/img/ 
1

尝试/(?!<\?= $folder \?>)img\//

在开始的那个位,(?!< ...)是负面后视的标记,也就是说,用于检查...是否在字符串中较早。在这种情况下,我们检查字符串
<\?= $folder \?>(注意转义问号)是否在字符串中较早。 如果在img/的前面发现该部分,则该部分将被拒绝并且不匹配。所以,每个img/的情况只会匹配一次。

这个正则表达式对于多于一个发生次数为img/的行将失败。可能有办法允许多次出现,但它可能是一个非常长的正则表达式;在我看来,通常当正则表达式变得太长时,可能是时候切换到另一种工具了。

+0

请详细说明这个正则表达式如何回答这个问题。 – JAL

相关问题