如何使用正则表达式从某些文本中提取脚本标签?
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 解析器。 为了证明这个事实,你的正则表达式会杀死太多这样的:<!-- <script> needs a type attribute --><p>Some text here.</p><script></script>
@Robin Day:您的两个示例(<script ... />
和在脚本中使用 </script>
)都是无效的 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 上完全失败。它甚至不会输出任何有用的东西:它只会抛出。以上是关于如何使用正则表达式从某些文本中提取脚本标签?的主要内容,如果未能解决你的问题,请参考以下文章