如何为此表达式创建子匹配?

时间:2013-08-01 17:21:12

标签: javascript regex string expression

我正在针对DOM运行正则表达式以从页面返回帐户状态。

这是页面上的字符串:

<h3>Status</h3><p>Completed</p>

这就是我目前正在使用的表达式 <h3>Status</h3>[\s\S]*?<p>([\s\S]*?)</p>

我的目标是只从此字符串中获取“已完成”状态,但不确定如何执行此操作。我已经阅读了一些关于子匹配的内容;只是不确定如何实现它。

2 个答案:

答案 0 :(得分:0)

这将有效:/<h3>Status<\/h3>[\s\S]*<[^>]*>([^<]+)<.*/

在此处查看:http://jsfiddle.net/M7kJ7/

但严重的是......使用DOM函数!为什么要使用正则表达式?

编辑:使用DOM函数解决问题的示例:http://jsfiddle.net/DycGh/

EDIT2 :好的,在阅读完所有评论后,我得出结论,你确实有正当理由不能直接访问数据库(你不能!他们不会给你访问权限)它)) 并且您不能使用本机DOM函数(您不是直接在每个页面上执行js,而是使用一个中心页面来搜索其他页面) , 但是,我仍然认为浏览器端 javascript是正确的路径。

使用服务器端 javascript(node.js)或其他语言(如perl)会更好。通过解析器使用DOM也是正确的。

如果您选择node.js路径,则可以使用node-htmlparser。从您的节点应用程序中,您将打开每个URL,使用解析器的函数获取数据,然后构造一个json输出。您的页面将向节点发出ajax请求,并获取其json结果,您将使用该结果创建输出。

如果你选择perl,可以使用HTML::DOM。其余程序将类似。

它不一定是perl或node.js,只是我所知道的选项。使用php,python或ruby,你也可以做到。 (但你必须谷歌搜索解析器)

但最好是使用服务器端脚本。

答案 1 :(得分:0)

re.match()返回一个包含每个捕获组的子匹配的数组。所以使用:

var re = new RegExp('<h3>Status</h3>[\s\S]*?<p>([\s\S]*?)</p>');
var match = re.match(str);
var submatch = match[1];