如何使用正则表达式从某些文本中提取脚本标签?

Posted

技术标签:

【中文标题】如何使用正则表达式从某些文本中提取脚本标签?【英文标题】:How can I extract a script tag from some text using Regex? 【发布时间】:2010-08-12 12:54:32 【问题描述】:

我不太了解正则表达式,我正在尝试从一些提取的页面文本中获取所有脚本标签。我尝试了以下模式:

<script.*?>.*?</script>

但这似乎没有返回任何包含任何代码的脚本标记。 IE。它来自以下:

<script type="text/javascript" src="Scripts/Scipt1.js"></script>
<script type="text/javascript" src="Scripts/Scipt2.js"></script>

<script type="text/javascript">
   function SomeMethod()
   

   
</script>

我只会得到以下结果:

<script type="text/javascript" src="Scripts/Scipt1.js"></script>
<script type="text/javascript" src="Scripts/Scipt2.js"></script>

如何退回全部 3 个? (注意。我确实想在结果中保留外部脚本标签)。

【问题讨论】:

使用 XML 解析器。每次使用 Regex 解析 XML 时,上帝都会杀死一只小猫。 请don't。使用 XML 解析器。 你不能用正则表达式可靠地做到这一点,正如这里多次所说的那样,html 不是正则语言,因此不能用正则表达式解析。你需要一个 HTML 解析器。 为了证明这个事实,你的正则表达式会杀死太多这样的:&lt;!-- &lt;script&gt; needs a type attribute --&gt;&lt;p&gt;Some text here.&lt;/p&gt;&lt;script&gt;&lt;/script&gt; @Robin Day:您的两个示例(&lt;script ... /&gt; 和在脚本中使用 &lt;/script&gt;)都是无效的 HTML 4.01。 【参考方案1】:

. 默认情况下不匹配换行符,因此您只会得到单行结果。

使用RegexOptions.Singleline 解决此问题。它改变了. 的含义以匹配任何字符,包括换行符,因此您也可以获得多行匹配。

不要被这个名字弄糊涂了。也不要将它与完全不同的 RegexOptions.Multiline 混淆(阅读 IntelliSense 工具提示以了解)。

【讨论】:

这实际上效果很好,很快并且给了我想要的东西......反正我不喜欢小猫,所以如果上帝杀死一只小猫,我并不在乎,因为我使用正则表达式。 【参考方案2】:

您应该使用HTML Agility Pack。

例如:

var doc = new HtmlDocument();
doc.Parse(source);

var scripts = doc.DocumentNode.Descendants("script"); 

【讨论】:

【参考方案3】:

取决于 HTML 的质量。

var scripts = XDocument.Parse(HTMLSTRING).Descendants("SCRIPT");

编辑:Pre Xml.Linq 版本:

XmlDocument xDoc = new XmlDocument();
xDoc.Load(HTMLSTRING);
XmlNodeList scripts = xDoc.SelectNodes("//*/SCRIPT");

注意,两者都是未经测试的......

【讨论】:

不幸的是,我在这个项目中使用了 c#2.0。看起来这将是一个很好的解决方案。 您仍然可以使用 XmlDocument 对象。不止一行代码。 添加了,正如我所说,未经测试,但你应该明白了。您将遇到的最大问题是您的 HTML 是否是有效的 XML。 是的,似乎有问题“有多个根元素。”。这个项目中有很多第三者的废话。即基础设施,所以质量是一个相当牵强的想法。 XML 解析器将在完全有效的高质量 HTML 上完全失败。它甚至不会输出任何有用的东西:它只会抛出。

以上是关于如何使用正则表达式从某些文本中提取脚本标签?的主要内容,如果未能解决你的问题,请参考以下文章

Java正则表达式提取标签之间的文本

从 HTML 中提取文本的正则表达式

构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]

如何使用正则表达式或子字符串从字符串中提取文本?

如何在Google表格中获取某些值后如何进行正则表达式提取

html文本中链接的正则表达式