[英]Regex match string if not
我正在使用正则表达式替换html文件中的图片源网址。
我想以例如更换img/
与<?= $folder ?>/img/
问题:当我多次运行正则表达式时,它将再次替换img/
,从而创建:
<?= $folder ?>/<?= $folder ?>/img
..等等。 有没有办法告诉正则表达式替换img/
如果尚未<?= $folder ?>/img
?
我正在尝试/^(?:(?!<?= $folder ?>/img).)*$/
但不确定如何首先匹配并检查它是否还不包含<?= $folder ?>/img
如果您更喜欢正则表达式,请尝试:
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/
尝试/(?!<\\?= $folder \\?>)img\\//
。
开头的位(?!< ... )
是负向后看的表示法,即检查...
是否在字符串中更早。 在这种情况下,我们正在检查字符串
<\\?= $folder \\?>
(注意转义的问号)在字符串的前面。 如果该部分较早在img/
的行中找到,它将被拒绝,并且将不匹配。 因此, img/
每种情况将仅匹配一次。
对于多于一次img/
行,此正则表达式将失败。 也许有一种方法可以允许多次出现,但是它可能是一个很长的正则表达式。 在我看来,通常当正则表达式过长时,可能是时候切换到其他工具了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.