如何解析HTML/XML并从中提取信息?
我需要匹配所有这些开始标记:
<p>
<a href="foo">
Run Code Online (Sandbox Code Playgroud)
但不是这些:
<br />
<hr class="foo" />
Run Code Online (Sandbox Code Playgroud)
我想出了这个,并希望确保我做对了.我只抓住了a-z.
<([a-z]+) *[^/]*?>
Run Code Online (Sandbox Code Playgroud)
我相信它说:
/,然后我有这个权利吗?更重要的是,你怎么看?
一个错误我看到人们做了,并再次试图解析XML或HTML用正则表达式.以下是解析XML和HTML很难的几个原因:
人们希望将文件视为一系列行,但这是有效的:
<tag
attr="5"
/>
Run Code Online (Sandbox Code Playgroud)
人们希望将<或<tag视为标记的开头,但是这样的东西存在于野外:
<img src="imgtag.gif" alt="<img>" />
Run Code Online (Sandbox Code Playgroud)
人们通常希望将起始标记与结束标记匹配,但XML和HTML允许标记包含自身(传统的正则表达式根本无法处理):
<span id="outer"><span id="inner">foo</span></span>
Run Code Online (Sandbox Code Playgroud)
人们通常希望匹配文档的内容(例如着名的"查找给定页面上的所有电话号码"问题),但数据可能会被标记(即使在查看时看起来是正常的):
<span class="phonenum">(<span class="area code">703</span>)
<span class="prefix">348</span>-<span class="linenum">3020</span></span>
Run Code Online (Sandbox Code Playgroud)
评论可能包含格式不正确或不完整的标记:
<a href="foo">foo</a>
<!-- FIXME:
<a href="
-->
<a href="bar">bar</a>
Run Code Online (Sandbox Code Playgroud)
你还知道其他什么问题?
试图在页面上找到链接.
我的正则表达式是:
/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/
Run Code Online (Sandbox Code Playgroud)
但似乎失败了
<a title="this" href="that">what?</a>
Run Code Online (Sandbox Code Playgroud)
我如何更改我的正则表达式来处理未首先放在标签中的href?
我是否需要在html属性值中转义引号?允许哪些字符?
这有效吗?
<span title="This is a 'good' title.">Hi</span>
Run Code Online (Sandbox Code Playgroud) 我刚刚回顾了我之前发过的一篇文章,并注意到一些人建议我不使用正则表达式来解析xml.在这种情况下,xml相对简单,Regex没有任何问题.我还在解析许多其他代码格式,所以为了统一起见,它是有意义的.但我很好奇这可能会在其他情况下造成问题.这只是一个"不要重新发明轮子"的问题吗?
我必须编写某种解析器来获取String并用其他字符替换某些字符集.代码如下所示:
noHTMLString = noHTMLString.replaceAll("</p>", "\n");
noHTMLString = noHTMLString.replaceAll("<br/>", "\n\n");
noHTMLString = noHTMLString.replaceAll("<br />", "\n\n");
//here goes A LOT of lines like these ones
Run Code Online (Sandbox Code Playgroud)
该函数非常长并且执行许多字符串替换.这里的问题是它需要花费很多时间,因为它被称为很多次的方法,从而降低了应用程序的性能.
我已经阅读了一些关于使用StringBuilder作为替代方案的一些线程,但它缺少ReplaceAll方法,并且正如此处所述,string.replaceAll()性能是否受到字符串不变性的影响?String类中的replaceAll方法适用于
Match Pattern&Matcher和Matcher.replaceAll()使用StringBuilder存储最终返回的值,因此我不知道切换到StringBuilder是否会真正减少执行替换的时间.
您是否知道以快速方式快速完成大量String替换?你对这个问题有什么建议吗?
谢谢.
编辑:我必须创建一个报告,其中包含一些带有html文本的字段.对于每一行,我正在调用替换这些字符串中的所有html标记和特殊字符的方法.使用完整报告,解析所有文本需要3分钟以上.问题是我必须经常调用该方法
我正在尝试使用Ruby检索网页的每个外部链接.我正在使用String.scan这个正则表达式:
/href="https?:[^"]*|href='https?:[^']*/i
Run Code Online (Sandbox Code Playgroud)
然后,我可以使用gsub删除href部分:
str.gsub(/href=['"]/)
Run Code Online (Sandbox Code Playgroud)
这很好用,但我不确定它在性能方面是否有效.这可以使用,或者我应该使用更具体的解析器(例如nokogiri)?哪种方式更好?
谢谢!
我们现在都知道,使用正则表达式解析HTML通常是不可能的,因为它正在解析上下文敏感的语法,而正则表达式只能解析常规语法.其他编程语言也是如此.
现在,最近,Rainbow.js语法荧光笔已经公布.它的前提被描述为非常简单:
彩虹本身很简单.它遍历代码块,处理正则表达式模式,并在标记中包装匹配模式.
我认为语法突出显然本质上是一个与语言解析相同的复杂任务,如果我们假设它必须既好又适合多种语言.尽管如此,虽然对该库有相当多的批评,但黑客新闻的讨论(作为技术倾向的讨论的例子)都没有提到使用正则表达式突出语法在一般情况下基本上是不可能的,我会考虑一个主要的,显示停止的缺陷.
现在的问题是:有什么我想念的吗?特别是: