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

时间:2012-10-25 20:24:24

标签: regex coldfusion

我正在尝试从我通过CFHTTP请求收到的HTML内容中提取javascript代码。

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

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

这将抓住:

<script>testtesttest</script<

但不是

<script>
testtest

</script>

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

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

任何人都可以帮助我吗?

干杯

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

2 个答案:

答案 0 :(得分:8)

(?m)多线模式是让^$在换行符上匹配(不仅仅是默认情况下字符串的开头/结尾),但你要在这里尝试做什么make .包含换行符 - 您想要(?s)(全点模式)。

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

的方法
var result = jsoup.parse(html).select('script').text();

有关在CF中使用jSoup的更多详细信息是available here,或者您可以使用TagSoup解析器ships with CF10(因此您无需担心jar / etc)


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

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

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

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

result = ListRest( result[1] , '>' );

答案 1 :(得分:0)

您可以使用点匹配所有模式或将.替换为[\s\S]以获得相同的效果。

<script[^>]*>[\s\S]*?</script> would match everything including newlines.