2

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

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

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

这将捕获:

<script>testtesttest</script<

但不是

<script>
testtest

</script>

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

注意,脚本标签之间通常会有 javascript,而不是简单的文本,还有像 {}();:-_ 等字符。

谁能帮我吗?

干杯

[[更新]]谢谢大家,我会尝试解决方案。我喜欢正则表达式,因为但我也会研究 HTML Parser。

4

2 回答 2

8

(?m)多行模式用于制作^$匹配换行符(不仅仅是默认的字符串的开始/结束),但您在这里尝试做的是.包含换行符 - 因为您想要(?s)(全点模式)。

但是,我可能不会使用正则表达式来执行此操作 - HTML 解析器是一种更强大的解决方案。以下是使用jSoup的方法:

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

有关在 CF 中使用 jSoup 的更多详细信息,请参见此处,或者您可以使用CF10 附带的TagSoup解析器(因此您无需担心 jars/etc)。


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

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

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

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

result = ListRest( result[1] , '>' );
于 2012-10-25T21:54:18.177 回答
0

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

<script[^>]*>[\s\S]*?</script> would match everything including newlines.
于 2012-10-25T21:59:23.873 回答