使用RegEx for Coldfusion在<script> </ script>标记之间查找文本,包括换行符

Mat*_*ijs 2 regex coldfusion

我试图从我通过CFHTTP请求收到的HTML内容中提取javascript代码.

我有这个简单的正则表达式,只要标记之间的代码中没有换行符就可以捕获所有内容.

var result=REMatch("<script[^>]*>(.*?)</script>",html);
Run Code Online (Sandbox Code Playgroud)

这将抓住:

<script>testtesttest</script<
Run Code Online (Sandbox Code Playgroud)

但不是

<script>
testtest

</script>
Run Code Online (Sandbox Code Playgroud)

我曾尝试将(?m)用于多行,但它不能像那样工作.我正在使用参考来解决它,但我只是没有使用正则表达式.

抬头,通常脚本标签之间会有javascript,而不是简单的文本,所以还有{}();等字符.-_等.

谁能帮我吗?

干杯

[[更新]]谢谢大家,我会尝试解决方案.我赞成正则表达式,但我也会研究HTML Parser.

Pet*_*ton 8

(?m)多行模式是制作^$比赛上换行符(没有刚开始/结束字符串作为默认值),但你想在这里做的是让.包括新行-为您要(?s)(点所有的模式).

但是,我可能不会使用正则表达式 - HTML解析器是一个更强大的解决方案.以下是使用jSoup的方法:

var result = jsoup.parse(html).select('script').text();
Run Code Online (Sandbox Code Playgroud)

有关在CF中使用jSoup的更多详细信息,请参阅此处,或者您可以使用随CF10一起提供TagSoup解析器(因此您无需担心jar/etc).


如果你真的想要正则表达式,那么你可以使用这个:

var result = rematch('<script[^>]*>(?:[^<]+|<(?!/script>))+',html);
Run Code Online (Sandbox Code Playgroud)

与使用(?s).*?它不同,避免匹配空块(但在某些边缘情况下仍然会失败 - 如果需要准确性,请使用HTML解析器).

要仅从第一个脚本块中提取文本,您可以使用以下方法去除脚本标记:

result = ListRest( result[1] , '>' );
Run Code Online (Sandbox Code Playgroud)