我的输入字符串类似于:
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'会产生奇怪的结果。
答案 0 :(得分:1)
我不确定你的匹配组是什么,但这个表达式怎么样:
/^<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组是您感兴趣的