如何编写正则表达式从源HTML中提取名字和姓氏?

如何编写正则表达式从源HTML中提取名字和姓氏?,html,regex,Html,Regex,我一直在努力想出一个正则表达式,从下面的HTML中提取名字和姓氏。我的regex-fu不太强 <span id="label_85110"><b>First Name</b></span> <br/> <span id="value_85110">AWeber- Email Parser</span> <br/> </p> <p> <span id="la

我一直在努力想出一个正则表达式,从下面的HTML中提取名字和姓氏。我的regex-fu不太强

<span id="label_85110"><b>First Name</b></span>
<br/>
    <span id="value_85110">AWeber- Email Parser</span>
    <br/>
</p>
<p>
<span id="label_86004"><b>Last Name</b></span>
<br/>
    <span id="value_86004">Submission</span>
    <br/>
</p>
<p>
<span id="label_85111"><b>Email</b></span>
<br/>
    <span id="value_85111">leslie@dakno.com</span>
    <br/>
</p>
<p>
<span id="label_85540"><b>Phone</b></span>
<br/>
    <span id="value_85540">919-923-7017</span>
    <br/>
</p>
名字

电子邮件解析器


服从

电子邮件
leslie@dakno.com

电话
919-923-7017


有一点取决于您实际的正则表达式库或工具的语法,但基本上使用如下内容:

<span id="label_85110"><b>([^<]+)</b>
([^@oliver1

请注意,正则表达式中的关键字是“Regular”。正则表达式与一起使用

不幸的是,(X)HTML不是一种常规语言,而是一种语言

您无法编写能够正确解析上下文无关语言的正则表达式。这是一个经过数学证明的事实;您无法编写能够正确解析上下文无关语言的正则表达式

解决方案:使用XPath 相反,您应该使用XML解析器;您已经在使用XHTML,这意味着您可以使用它。(尽管您的代码段开头缺少一个

任何解析器、正则表达式或查询如何识别名字和姓氏?我看到的最好的是“
元素,它们位于

之后”,这是非常弱的

尽管如此,您仍然可以编写XPath查询来查找“

之后的元素”

…但这也会找到
电子邮件
电话
的值,因此您只需要前两个结果

或者,您可以在
元素上使用
id
属性:

//span[@id='value_85110']/text()|//span[@id='value_86004']/text()
如果你能修改HTML 理想情况下,我的建议是使您的XHTML更具语义:

<label for="first-name-1">First Name</label>
<span id="first-name-1" class="first-name">Aweber- Email Parser</span>
<label for="last-name-1">Last Name</label>
<span id="last-name-1" class="last-name">Submission</span>
<label for="email-address-1">Email</label>
<span id="email-address-1" class="email-address">leslie@dakno.com</span>
<label for="phone-number-1">Phone</label>
<span id="phone-number-1" class="phone-number">919-923-7017</span>
…然后使用XPath查询,如下所示:

//span[@class='first-name'] | //span[@class='last-name']

免责声明:这只是对问题的回答,而不是对使用regex的认可

<span[^>]*?><b>First Name(?:<[^>]+?>|\s)+([^<]*?)(?:<[^>]+?>|\s)+?Last Name(?:<[^>]+?>|\s)+([^<]*)[\S\s]+?Phone[\S\s]+?<\/p>

]*?>名字(?::::+?>|\s)+([^ |\s)+姓氏(?:::+?>|\s)+([^请告诉我上面提供的电子邮件和电话号码不是真实的。可能与“不”重复。请不要。您使用的是哪种编程语言?@JYelton在电子邮件上快速搜索将显示它已经是公开的。-1为“我们不知道细节”这正是为什么我们不能鼓励任何海报使用正则表达式解析HTML的原因。在没有其他信息的情况下,规范是不应该解析(X)HTML与RegEx。我不鼓励海报。海报上有一些关于使用RegEx可能存在的缺点/陷阱的评论。这是他的决定。我发布了答案,s.t。如果他决定支持RegEx,他会得到一个如何使用RegEx组匹配的提示。+1是因为他试图给海报他想要的。他不是在要求什么关于他为什么不应该……他想知道怎么做。他甚至没有要求一个完整的解析器……他只是想提取一些文本。@b库尔德-我同意OP不需要诽谤;链接从来没有对任何人有用。相反,我们必须解释为什么OP做的不是一个好主意;你的答案是好的(没有被否决)正如您所强调的,您的解决方案在范围上是有限的,而不是一个通用的解决方案。@maxschlepzig的回答并不承认这一点,而是对那些提出不同建议的人的能力提出了挑战。使用html/xml解析器并不过分。只需再编写几行代码。最困难的部分是概念性的。这意味着OP有了一个全新的概念他腰带上的工具。为什么你认为海报会影响html的生成?如果可以的话,他一开始就不需要解析它……他可以只解析一个普通的DB查询,然后…@maxschlepzig-编辑以强调“使用XPath”而不是“修复html”
//span[@class='first-name'] | //span[@class='last-name']
<span[^>]*?><b>First Name(?:<[^>]+?>|\s)+([^<]*?)(?:<[^>]+?>|\s)+?Last Name(?:<[^>]+?>|\s)+([^<]*)[\S\s]+?Phone[\S\s]+?<\/p>