Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript RegExp lookback替代方案?_Javascript_Html_Regex - Fatal编程技术网

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(和其他?)有这样一个很好的“内存节省器”