我正在尝试从我通过CFHTTP请求收到的HTML内容中提取javascript代码。
我有这个简单的正则表达式,只要标记之间的代码中没有换行符就可以捕获所有内容。
var result=REMatch("<script[^>]*>(.*?)</script>",html);
这将抓住:
<script>testtesttest</script<
但不是
<script>
testtest
</script>
我曾尝试将(?m)用于多行,但它不能像那样工作。 我正在使用reference来解决这个问题,但我只是没有使用正则表达式。
抬头,通常脚本标签之间会有javascript,而不是简单的文本,所以还有{}();等字符。
任何人都可以帮助我吗?
干杯
[[UPDATE]] 谢谢大家,我会尝试解决方案。我赞成正则表达式,但我也会研究HTML Parser。
答案 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.