JavaScript RegExp lookback替代方案?
我制作了一个正则表达式,它与JavaScript RegExp lookback替代方案?,javascript,html,regex,Javascript,Html,Regex,我制作了一个正则表达式,它与中的title=“…”匹配,而是指向RegExp的链接。 另外,如果可能的话,我需要去掉标题周围的title=”“。因此,只在href之后返回标题,在href之前返回标题。如果不可能,我想我可以使用.replace()并将其替换为“” zx81的表达式: 我不确定是否可以用JavaScript中的单个正则表达式来实现这一点;但是,您可以这样做: var-str='\ var-str='\ \ \ \ \ '; var div=document.createEl
中的title=“…”
匹配,而是指向RegExp的链接。
另外,如果可能的话,我需要去掉标题周围的title=”“。因此,只在href
之后返回标题,在href
之前返回标题。如果不可能,我想我可以使用.replace()
并将其替换为“
”
zx81的表达式:
我不确定是否可以用JavaScript中的单个正则表达式来实现这一点;但是,您可以这样做:
var-str='\
var-str='\
\
\
\
\
';
var div=document.createElement('div');
div.innerHTML=str;
var titles=Array.apply(this,div.queryselectoral('a[title]')).map(函数(项){return item.title;});
document.body.innerText=标题;
我不确定是否可以用JavaScript中的单个正则表达式来实现这一点;但是,您可以这样做:
var-str='\
var-str='\
\
\
\
\
';
var div=document.createElement('div');
div.innerHTML=str;
var titles=Array.apply(this,div.queryselectoral('a[title]')).map(函数(项){return item.title;});
document.body.innerText=标题;
首先,您必须知道,大多数人更喜欢使用DOM解析器解析html,因为正则表达式可能会带来某些危险。也就是说,对于这个简单的任务(无嵌套),您可以在regex中执行以下操作
使用捕获组
JavaScript中没有lookbehinds或\K
,但是我们可以将我们喜欢的内容捕获到一个捕获组中,然后从该组中检索匹配项,而忽略其余部分
此正则表达式捕获组1的标题:
var str = '\
<a href="www.google.com" title="some title">Some Text</a>\
<a href="www.google.com" title="some other title">Some Text</a>\
<a href="www.google.com">Some Text</a>\
<img href="www.google.com" title="some title"/>\
';
var div = document.createElement('div');
div.innerHTML = str;
var titles = Array.apply(this, div.querySelectorAll('a[title]')).map(function (item) { return item.title; });
document.body.innerText = titles;
,查看右侧窗格中的组1捕获:这就是我们感兴趣的内容
示例JavaScript代码
<a [^>]*?(title="[^"]*")
var unique_results=[];
var yourString='your\u test\u string'
var myregex=/]*?(title=“[^”]*”)/g;
var thematch=myregex.exec(您的字符串);
while(匹配!=null){
//它是独一无二的吗?
如果(唯一结果.indexOf(匹配[1])
,则最多
(
捕获组
title=“
literal字符
[^”]*
任何不是引号的字符
“
结束报价
)
终端组1
首先,您必须知道,大多数人喜欢使用DOM解析器解析html,因为正则表达式可能会带来某些危险。也就是说,对于这个简单的任务(无嵌套),您可以在正则表达式中执行以下操作
使用捕获组
JavaScript中没有lookbehinds或\K
,但是我们可以将我们喜欢的内容捕获到一个捕获组中,然后从该组中检索匹配项,而忽略其余部分
此正则表达式捕获组1的标题:
var str = '\
<a href="www.google.com" title="some title">Some Text</a>\
<a href="www.google.com" title="some other title">Some Text</a>\
<a href="www.google.com">Some Text</a>\
<img href="www.google.com" title="some title"/>\
';
var div = document.createElement('div');
div.innerHTML = str;
var titles = Array.apply(this, div.querySelectorAll('a[title]')).map(function (item) { return item.title; });
document.body.innerText = titles;
,查看右侧窗格中的组1捕获:这就是我们感兴趣的内容
示例JavaScript代码
<a [^>]*?(title="[^"]*")
var unique_results=[];
var yourString='your\u test\u string'
var myregex=/]*?(title=“[^”]*”)/g;
var thematch=myregex.exec(您的字符串);
while(匹配!=null){
//它是独一无二的吗?
如果(唯一结果.indexOf(匹配[1])
,则最多
(
捕获组
title=“
literal字符
[^”]*
任何不是引号的字符
“
结束报价
)
终端组1
我不确定您的html源代码来自哪里,但我知道有些浏览器在作为“innerHTML”获取时不尊重源代码的大小写(或属性顺序)
此外,作者和浏览器都可以使用单引号和双引号。
这是我所知道的最常见的两个跨浏览器陷阱
因此,您可以尝试:/来解决单引号与双引号的情况
zx81的答案已经解释了第一部分。\1
与第一个捕获组匹配,因此它与使用的开头引号匹配。现在,第二个捕获组应该包含裸标题字符串
一个简单的例子:
var unique_results = [];
var yourString = 'your_test_string'
var myregex = /<a [^>]*?(title="[^"]*")/g;
var thematch = myregex.exec(yourString);
while (thematch != null) {
// is it unique?
if(unique_results.indexOf(thematch[1]) <0) {
// add it to array of unique results
unique_results.push(thematch[1]);
document.write(thematch[1],"<br />");
}
// match the next one
thematch = myregex.exec(yourString);
}
var rxp=/]*?title=(['“])([^\1]*?)\1/gi
,res=[]
,tmp
;
而(tmp=rxp.exec(str)){//str是您的字符串
res.push(tmp[2]);//将字符串添加到数组的示例。
}
然而,正如其他人所指出的,使用regex标记soup(又名HTML)确实是不好的(一般来说),robertmesserle的替代方法(使用DOM)更可取
警告(我差点忘了)
IE6(和其他?)有一个很好的“内存节省功能”,可以方便地删除所有不需要的引号(对于不需要空格的字符串)。因此,在这里,这个正则表达式(和zx81)将失败,因为它们依赖于引号的使用!!!!回到绘图板上…(在重新定义HTML时,这似乎是一个永无止境的过程).我不确定您的html源代码来自哪里,但我知道有些浏览器在作为“innerHTML”获取时不尊重源代码的大小写(或属性顺序)
此外,作者和浏览器都可以使用单引号和双引号。
这是我所知道的最常见的两个跨浏览器陷阱
因此,您可以尝试:/来解决单引号与双引号的情况
zx81的答案已经解释了第一部分。\1
与第一个捕获组匹配,因此它与使用的开头引号匹配。现在,第二个捕获组应该包含裸标题字符串
一个简单的例子:
var unique_results = [];
var yourString = 'your_test_string'
var myregex = /<a [^>]*?(title="[^"]*")/g;
var thematch = myregex.exec(yourString);
while (thematch != null) {
// is it unique?
if(unique_results.indexOf(thematch[1]) <0) {
// add it to array of unique results
unique_results.push(thematch[1]);
document.write(thematch[1],"<br />");
}
// match the next one
thematch = myregex.exec(yourString);
}
var rxp=/]*?title=(['“])([^\1]*?)\1/gi
,res=[]
,tmp
;
而(tmp=rxp.exec(str)){//str是您的字符串
res.push(tmp[2]);//将字符串添加到数组的示例。
}
然而,正如其他人所指出的,使用regex标记soup(又名HTML)确实是不好的(一般来说),robertmesserle的替代方法(使用DOM)更可取
警告(我差点忘了)
IE6(和其他?)有这样一个很好的“内存节省器”