正则表达式匹配 div 中的文本,但忽略子元素(如果存在)

regular expression to match the text inside a div but ignore the child elements if they exist

我正在尝试匹配 <div> 中包含的字符串 问题是我需要忽略 div 中任何子元素内的任何内容,我似乎无法让它符合我的需要。

我必须在正则表达式中保留一个由 3 部分组成的格式,即 /^()(.*?)()$/ where

左右两边是起点和终点

假设我有这个 HTML:

<div class="some stuff">Could Be Anything<span class="specifics">Huge</span></div>

现在我需要从给出的 HTML 示例中提取“Could Be Anything”,而子元素中没有“Huge”。遵循 3 部分规则。

注意: <div 不能有任何子元素。它可能只是文本(我想要的)或文本和子元素

我的尝试是 /^(>)(.*?)(<span)$/,但没有成功,而且我不知道该从何做起。任何帮助将不胜感激!

编辑:

更清楚地了解我正在尝试做什么。

我正在尝试 return 来自网页的一些体育统计数据。我正在使用 kimonolabs 抓取网页。我要抓取的元素是 table 中的一个。这包含一个里面有一些文本的。 kimono 使用 css 选择器来知道从哪个元素中提取。然后正则表达式是过滤其他任何内容的选项。所以现在如果 div 里面有另一个元素,它 return 就是那个元素的文本,也就是 '的文本,但我不想要那个

对于这种字符串:

 <div class="some stuff">Could Be Anything<span class="specifics">Huge</span></div>

以下正则表达式将去除标签之间的第一个文本:

    /(>)(.*?)(<)/

1st Capturing group (>)
    > matches the characters > literally
2nd Capturing group (.*?)
    .*? matches any character (except newline)
        Quantifier: *? Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
3rd Capturing group (<)
    < matches the characters < literally

以上示例的总匹配项:

1.  [23-24] `>`
2.  [24-41] `Could Be Anything`
3.  [41-42] `<`

请注意,不应该有修饰符,特别是没有全局 g 修饰符。

这是比赛的截图,来源https://www.regex101.com/

更新:

特定 O.P. 问题的解决方案是以下正则表达式:

/(^)([^<]*)(<span)/i

这个问题可以忽略最后一个标志。

这假定它与 <div> 标签内的内容相匹配。


如果 HTML 代码过于 complicated/ill,这是我想出的正则表达式:

/<div(?:\s*[a-z_\-]+(?:=(?:"[^"]*"|'[^']*'|[^>]+))?)*>([^<]+)<span/i

这太复杂了。

这适用于格式最糟糕的代码。

它按要求工作:将数据保存在 <div> 内但在 <span>.

之前

您可以在此处对其进行测试和检查:https://regex101.com/r/tT1xM4/1


免责声明

虽然我制作了这个正则表达式,但正则表达式不是正确的工具!

不要对这种复杂的数据使用正则表达式!

我不保证这将适用于所有和任何可能的任意 HTML 代码。
我注意支持丑陋的代码,如 <div class=">" get-data="" seg=">" test>eyhrtfu<span>(正确匹配 eyhrtfu),但这不是一个完美的解决方案。

如果你想要一个完美的解决方案,请使用jQuery/document。querySelectorAll/Prototype或phpQuery或其他解析技术。