Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.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 如何让regex匹配多个脚本标记?_Javascript_Regex - Fatal编程技术网

Javascript 如何让regex匹配多个脚本标记?

Javascript 如何让regex匹配多个脚本标记?,javascript,regex,Javascript,Regex,我试图返回文本体中任何标记的内容。我目前正在使用以下表达式,但它只捕获第一个标记的内容,并忽略其后的任何其他标记 以下是html的一个示例: <script type="text/javascript"> alert('1'); </script> <div>Test</div> <script type="text/javascript"> alert('2');

我试图返回文本体中任何标记的内容。我目前正在使用以下表达式,但它只捕获第一个标记的内容,并忽略其后的任何其他标记

以下是html的一个示例:

    <script type="text/javascript">
        alert('1');
    </script>

    <div>Test</div>

    <script type="text/javascript">
        alert('2');
    </script>

警报(“1”);
试验
警报(“2”);
我的正则表达式如下所示:

//scripttext contains the sample
re = /<script\b[^>]*>([\s\S]*?)<\/script>/gm;
var scripts  = re.exec(scripttext);
//scripttext包含示例
re=/]*>([\s\s]*?)/gm;
var scripts=re.exec(scripttext);
当我在IE6上运行它时,它返回2个匹配项。第一个包含完整标记,第二个包含警报(“1”)


当我在上面运行它时,它会给我2个结果,每个结果只包含脚本标记。

尝试使用全局标志:

document.body.innerHTML.match(/<script.*?>([\s\S]*?)<\/script>/gmi)
document.body.innerHTML.match(/([\s\s]*?)/gmi)

编辑:添加了多行和不区分大小写的标志(原因很明显)。

第一组包含标记的内容

编辑:你不需要用引号把正则表达式括起来吗?比如:

re = "/<script\b[^>]*>([\s\S]*?)<\/script>/gm";
re=“/]*>([\s\s]*?)/gm”;

在.Net中,有一个子匹配方法,在PHP中,preg_match_all,它应该可以解决您的问题。在Javascript中没有这样的方法。但是你可以自己做

测试

选择$1elements方法将返回您想要的这里的“问题”在于
exec
的工作方式。它只匹配第一个匹配项,但将当前索引(即插入符号位置)存储在正则表达式的
lastIndex
属性中。要获取所有匹配项,只需将正则表达式应用于字符串,直到它无法匹配为止(这是一种非常常见的方法):

var scripttext='\nalert(\'1\')\n\n\n测试\n\n\n插入(\'2\')\n′;
var re=/]*>([\s\s]*?)/gm;
var匹配;
while(match=re.exec(scripttext)){
//完全匹配在匹配[0]中,而捕获的组在…[1]、…[2]等中。
console.log(匹配[1]);
}

不要使用正则表达式解析HTML。HTML不是一种常规语言。使用DOM的强大功能。这要容易得多,因为它是正确的工具

var scripts = document.getElementsByTagName('script');
试试这个

for each(var x in document.getElementsByTagName('script');
     if (x && x.innerHTML){
          var yourRegex = /http:\/\/\.*\.com/g;
          var matches = yourRegex.exec(x.innerHTML);
             if (matches){
          your code
 }}

你真的在用javascript编写正则表达式吗?你能包含匹配的代码吗?使用RegexBuddy 3.2.1,这很好。它捕获了两个标记的内容。我使用/gm。我稍微修改了regexp。它现在返回2个结果,每个结果都包含一个脚本标记,但它包含html。]*>([\s\s]*?)/gm如何仅返回内容?或者,如果使用正则表达式函数,请确保将其配置为捕获所有匹配项。其中一些需要多次调用,或者需要调用一个额外的参数,或者需要调用一个差分函数。@jacob-taylor似乎有点模糊。除了
新的RegExp
,你指的是什么regex函数?@Justin Johnson我的评论部分是由上面关于regex使用什么语言的问题驱动的。由于我不确定,而且它们正在得到结果,我认为它们可能受到了调用错误函数的影响。例如,在PHP中,preg_match和preg_match_all将返回第一个或所有匹配项。啊,非常好。我想是JavaScript。我想当我问到这个问题时,它被贴上了这样的标签,不过我不确定。不,你不知道。在javascript中,/…/表示正则表达式。如果需要,可以将其构建为字符串,但在构建过程中必须更加明确。例如:
/]*>([\s\s]*?)/g
相当于
新的RegExp(“]*>([\s\s]*?)”,“g”)
这个问题已经有了一个公认的答案,可以满足需要。
警告('.该死,又失败了!'@Svante怎么办?:)@kangax,@Svante想说,在他的代码示例中,正则表达式将失败。因为他得到了里面有
的字符串值。总是有理由想从字符串中手动解析dom。例如,如果您尝试使用innerHTML,IE8会清除脚本标记。如果我正在使用模块化小部件和html模板构建应用程序,这将成为一个问题。有时,在将html字符串转换为DOM之前,需要对其进行清理。@YuvalA:有两种可能:1。它是无效的HTML;然后你需要一个“标签汤解析器”。2.它是有效的HTML;然后需要一个HTML解析器。在任何情况下,解析后都可以使用简单的查询语法。GjQuery。parseHTML@Svante,jQuery.parseHTML将不会删除内联事件处理程序。我曾经做过一个Firefox扩展,它从WikipediaAPI获取HTML字符串,并从中创建DOM。Mozilla的家伙们一直拒绝使用它,因为缺乏卫生处理。HTML解析器总是首先从字符串创建DOM结构,他们只是不允许在“清理”字符串之前将其转换为DOM。。。
for each(var x in document.getElementsByTagName('script');
     if (x && x.innerHTML){
          var yourRegex = /http:\/\/\.*\.com/g;
          var matches = yourRegex.exec(x.innerHTML);
             if (matches){
          your code
 }}