【问题标题】:Regex for different pair of html tags不同对html标签的正则表达式
【发布时间】:2018-03-07 13:15:02
【问题描述】:

我需要匹配每对 <p>...<br><p CLASS='extmsg' >...<br> 的正则表达式来区分聊天对话的各个部分,我收到以下格式的字符串:

<p CLASS='extmsg'>16:30:24 ~ customer@home.com: hello<br>
<p>16:30:14 ~ consultant@company.com: hello to you<br>
<p CLASS='extmsg'>16:30:03 ~ sam.i.am@greeneggs.ham: how are you<br>
<p>03/06/2018 16:29:55 ~ bok.kier@ccc.pl: im fine<br> 

我需要它来解析方法。

【问题讨论】:

  • 使用正则表达式进行HTML解析不是recommended...
  • 需要首先展示一些研究成果

标签: html regex parsing


【解决方案1】:

不要使用正则表达式解析 HTML,使用适当的 XML/HTML 解析器。

理论:

根据编译理论,不能使用基于finite state machine的正则表达式解析HTML。由于 HTML 的分层结构,您需要使用pushdown automaton 并使用YACC 之类的工具来操作LALR 语法。

中的 realLife©®™ 日常工具:

您可以使用以下方法之一:

xmllint

xmlstarlet

saxon-lint(我自己的项目)


查看:Using regular expressions with HTML tags


示例:

xmllint --html --xpath '//p[@CLASS="extmsg"]/text()' file

【讨论】:

  • EG:用户想出一种方法将“
    ”放入他们的消息中;这会破坏正则表达式。
【解决方案2】:

根据 Giles Quenot 的回答,正则表达式不适合这种情况。使用适当的解析器是执行此操作的更好方法。如果您确实收到了所示格式的消息:

  • 每行一条消息
  • 每条消息都以“

  • 每条消息都以“
    ”结尾

一个更简单的想法可能是字符串匹配行的开头。我不知道您使用的是什么语言,但 javascript 中的示例可能是:

var inputString = "" // From wherever you get your data
var lines = inputString.split("\n")
for (i = 0; i < lines.length; i++) {
    var line = lines[i]
    if (line.indexOf("<p CLASS='extmsg'>") == 0) {
        console.log("Customer just said: " + line)
    } else {
        console.log("Representative just said: " + line)
    }
}

您也可以删除&lt;p&gt;&lt;br&gt; 标签,因为您已经知道它们的长度。

注意 如果数据格式发生变化(例如,设计师进入 CSS 文件并开始使用 BEM notation,将 extmsg 更改为 message--external,并添加 @987654327 @ 代表的消息)。就像您使用正则表达式或解析器一样。处理此问题的最佳方法是让提供数据的人为您提供适合此信息的 API。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2011-05-03
    相关资源
    最近更新 更多