Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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 什么正则表达式将匹配此数据?_Javascript_Regex_Parsing_Xhtml_Html Parsing - Fatal编程技术网

Javascript 什么正则表达式将匹配此数据?

Javascript 什么正则表达式将匹配此数据?,javascript,regex,parsing,xhtml,html-parsing,Javascript,Regex,Parsing,Xhtml,Html Parsing,我在XHTML文档中包含以下内容: <script type="text/javascript" id="JSBALLOONS"> function() { this.init = function() { this.wAPI = new widgetAPI('__BALLOONS__'); this.getRssFeed(); }; } </script> (专门针对Jav

我在XHTML文档中包含以下内容:

<script type="text/javascript" id="JSBALLOONS">
    function() {
        this.init = function() {
            this.wAPI = new widgetAPI('__BALLOONS__');
            this.getRssFeed();
        };
    }
</script>
(专门针对Javascript解决方案更新了帖子。)

在Javascript中,您的代码可能如下所示:

if (data.match(/<script[^>]+id="JSBALLOONS">([\S\s]*?)<\/script>/)) {
    inner_script = RegExp.$1;
}
if(data.match(/]+id=“jsballoes”>([\S\S]*?)/){
内部脚本=RegExp.$1;
}
括号之间的部分
([\S\S]*?)
由正则表达式引擎保存,在找到匹配项后可供您访问。在Javascript中,可以使用
RegExp.$1
引用脚本标记中匹配的部分。如果您有多个这样的组,并被
()
包围,您可以使用
RegExp.$2
,依此类推,直到
RegExp.$9

默认情况下,Javascript不会匹配换行符,因此我们必须使用
([\S\S]*?)
而不是
(.*)
,这可能更有意义。完整地说,在其他语言中,如果使用
s
修饰符(
/…/s
),则不需要这样做


(我必须补充一点,当从HTML页面中抓取这样的内容时,正则表达式通常非常脆弱。您最好使用框架来提取内容。)

绅士所说的$1是指“第一个捕获组的值”。当您将正则表达式的一部分括在括号中时,它定义了捕获组。你从左到右数一数。每个左括号都会启动一个新的捕获组。它们可以嵌套

(有一些方法可以定义子表达式而不定义捕获组-我忘记了语法。)

在Perl中,$1是保存第一个捕获组匹配的字符串的神奇变量,$2是第二个捕获组匹配的字符串,等等。其他语言可能要求您调用返回的match对象上的方法以获取第n个捕获组

但回到莫尔夫的解决方案。假设他说用这个模式代替:

/<script[^>]+id="JSBALLOONS">(.*)<\/script>/
/]+id=“jsballoes”>(*)/

在本例中,如果您有多个脚本元素,那么这个错误的模式将吞噬所有脚本元素,因为它是贪婪的,这一点值得解释。此模式将从第一个开始标记开始,匹配其结束标记,继续,最后匹配最后一个。molf解决方案的魔力在于(.*)中的问号,这使得它不贪婪。它将返回与模式匹配的最短字符串,因此不会占用额外的脚本元素。

不要尝试将正则表达式用于非正则语言。正确的方法是使用XML解析器resp。DOM:

document.getElementById("JSBALLOONS")
编辑:关于你的评论,我没有使用JavaScript或jQuery的经验,但经过一些搜索后,我认为应该可以使用以下方法:

$.ajax({
  type: "GET",
  url: "test.xml",
  dataType: "xml",
  success: function(xml) {
    return $(xml).find("#JSBALLOONS").text();
  }
});

是否有更合格的人可以更正此问题?

foo
作为包含代码的字符串。然后,您可以通过

foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))

foo=foo.substring(foo.indexOf('>')+1,foo.lastIndexOf('Hi,谢谢。这正是我所拥有的,但它包括脚本标记。你能解释一下$1是什么意思吗?我不熟悉。谢谢!@slypte,你使用哪种语言或工具来执行正则表达式?@molf,我正在使用javascript和jQuery.var javascript=This.data.match(/]+id)=“jsballogs”>([\S\S]*?)/ig);this.javascript=eval(“(“+javascript+”)”);@slypete,用Javascript更新了一个示例。在Javascript中,组保存在RegExp.$1、RegExp.$2等中,直到RegExp.$9。你好,我的感谢被版主删除了!?!仅供参考,这篇文章的结尾通常包括:谢谢,皮特。我不喜欢版主挑剔我的帖子,尤其是删除我的礼貌。谢谢,非常有用!文档远程加载到我需要从中提取选定内容的字符串中。我知道regex不是最佳解决方案。如果您知道其他可用的解决方案,请务必告诉我。谢谢!再次说明,它将不起作用。我已尝试过此操作。请参阅我的其他更一般的问题,原因是:希望有人能够为r这个问题。当有人提到regexing一种标记语言时,我总是喜欢贴一个链接
foo = foo.substring(foo.indexOf('>') + 1, foo.lastIndexOf('<'))