【问题标题】:finding text between <script></script> tags with RegEx for Coldfusion including linebreaks使用 RegEx for Coldfusion 查找 <script></script> 标记之间的文本,包括换行符
【发布时间】:2012-10-25 20:24:23
【问题描述】:

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

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

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

这将捕获:

<script>testtesttest</script<

但不是

<script>
testtest

</script>

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

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

谁能帮帮我?

干杯

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

【问题讨论】:

标签: regex coldfusion


【解决方案1】:

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

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

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

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


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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 使用[\s\S] 的唯一原因是(?s) 不可用(但它在这里)。
    • @PeterBoughton,你的回答提到了 ?s 修饰符,所以我提到了另一种选择
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-08-05
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多