正则表达式用于不同的html标签对

时间:2018-03-07 13:15:03

标签: html regex parsing

我需要正则表达式匹配每对<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> 

我需要它来解析方法。

2 个答案:

答案 0 :(得分:2)

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

理论:

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

中的realLife©®™日常工具:

您可以使用以下其中一项:

xmllint

xmlstarlet

saxon-lint(我自己的项目)

检查:Using regular expressions with HTML tags

示例:

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

答案 1 :(得分:0)

根据Giles Quenot的回答,正则表达不适用于此。使用正确的解析器是一种更好的方法。如果您确实收到所示格式的消息:

  • 每行一条消息
  • 每条消息都以&#34;&lt; p&#34;
  • 开头
  • 每封邮件都以&#34;&lt; br&gt;&#34;
  • 结尾

一个更简单的想法可能是对行的开头进行字符串匹配。我不知道您使用的是哪种语言,但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)
    }
}

您也可以修剪<p><br>标签,因为您已经知道它们有多长。

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