执行非贪婪的正则表达式匹配javascript

时间:2014-06-04 19:26:12

标签: javascript

我的输入字符串类似于:

var someString = 'This is a nice little string with <a target="_" href="/carSale/12/..">link1</a>. But there is more that we want to do with this. Lets insert another <a target="_" href="/carSale/13/..">link2</a> ';

我的最终目标是匹配其href属性中具有“carSale”的每个锚元素,并将其替换为锚内的文本。

for e.g
Replace <a target="_" href="/carSale/12/..">link1</a>  with string    link1

but it should not replace 
<a target="_" href="/bikeSale/12/..">link3</a> 

因为上面的href不包含字符串“carSale”

我为此创建了一个正则表达式对象。但它似乎正在进行一场贪婪的比赛。

var regEx = /(<a.*carSale.*>)(.*)(<\/a>)/;

var someArr = someString.match(regEx);

console.log(someArr[0]);
console.log(someArr[1]);
console.log(someArr[2]);
console.log(someArr[3]);

在正则表达式的末尾附加修饰符'g'会产生奇怪的结果。

这里小提琴: http://jsfiddle.net/jameshans/54X5b/

4 个答案:

答案 0 :(得分:1)

Online Demo

我不确定你的匹配组是什么,但这个表达式怎么样:

/^<a.*href="((?:.*)carSale(?:.*))".*>(.*)<\/a>$/

请注意,在此表达式中,我匹配 href 以包含carSale,我认为这是您希望表达式匹配的位置。

因为您想要替换整个表达式,因为我知道您需要做的就是:

 var result = '<a target="_" href="\/carSale/12\/..">link1<\/a>'.replace(/(^<a.*href="((?:.*)carSale(?:.*))".*>(.*)<\/a>$)/,"temp text");

答案 1 :(得分:1)

或者这个:

/(<a.*?carSale.*?>)(.*?)(<\/a>)/

?使您的转发器不贪婪,因此它尽可能少地吃,而*的默认行为是尽可能多地吃。因此,添加?后,(.*?)将停在第一个</a>而非最后一个

答案 2 :(得分:1)

使用解析器,而不是使用正则表达式。这不会轻易破解并使用原生(在浏览器中的本机)解析器,因此不易受到错误的影响:

var div = document.createElement("div");
div.innerHTML = someString;

// Get links
var links = div.querySelectorAll("a");
for (var i = 0; i < links.length; ++i) {
    var a = links[i];
    // If the link contains a href with desired properties
    if (a.href.indexOf("carSale") >= 0) {
        // Replace the element with text
        div.replaceChild(document.createTextNode(a.innerHTML), a);
    }
}

请参阅http://jsfiddle.net/prankol57/d72Vr/

但是,如果您确信您的html将始终遵循正则表达式指定的模式,那么您可以使用它。我会删除一个链接 RegEx match open tags except XHTML self-contained tags

答案 3 :(得分:0)

(<a[^>]*(href=\"([^>]*(?=carSale)[^>]*)\")[^>]*>)([^<]*)(<\/a>)*

第3组和第4组是您感兴趣的