当exec正则表达式时,php matchall喜欢javascript中的函数

php matchall like function in javascript when exec Regex

本问题已经有最佳答案,请猛点这里访问。

对不起,如果问题重复了

我有一个XML文件,类似于

1
2
3
4
5
6
7
8
9
<item>
   attr1.1</attr1>
   attr1.2</attr2>
</item>
...
<item>
   attr2.1</attr1>
   attr2.2</attr2>
</item>

我要做的就是使用regex获取一个项目数组。出于某种原因,我不想在这里使用jquery(我已经阅读过jquery.parsexml)。你能给我演示一下如何在JavaScript中获取所有的项或其他东西,比如在PHP中匹配_All()。这是我的瑞格鞋,

1
 /<item>([\w\W]+?)<\/item>/

谢谢您!


模拟这种行为的一种方法是在regex的replace方法中使用回调函数来构建结果。下面是一个方便地抽象成函数的例子…

1
2
3
4
5
function match_all(pattern, input){
    var result = [];
    input.replace(pattern, function(_, val){ result.push(val); })
    return result;
}

…用示例XML检查它…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var sample ="<item>
\
   attr1.1</attr1>
\
   attr1.2</attr2>
\
</item>
\
...
\
<item>
\
   attr2.1</attr1>
\
   attr2.2</attr2>
\
</item>"


console.log(match_all(/<item>([\w\W]+?)<\/item>/gm, sample))
// [
//   "?   attr1.1</attr1>?   attr1.2</attr2>?",
//   "?   attr2.1</attr1>?   attr2.2</attr2>?"
// ]

正如zerkms所提到的,已经有了在javascript中解析XML的方法,它们提供了更大的健壮性和灵活性。对于试图用正则表达式解析正则语言的超集的问题,还有一个特别臭名昭著的答案,简而言之,这不是最好的解决方法。

但是,如果您对这个用例感兴趣,不幸的是,在Python的re中没有类似于match_all来自php或findall的功能。看看这个stackoverflow,特别是代码块

1
2
3
4
5
var str ="I learned to play the Ukulele in Lebanon."
var regex = /le/gi, result, indices = [];
while ( (result = regex.exec(str)) ) {
    indices.push(result.index);
}

在第一个答案中,以相似的方式发现相同的正则表达式的许多出现的一些细节。