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

时间:2015-01-28 19:44:33

标签: regex html-parsing

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

我必须在正则表达式中保留3部分格式,即/^()(.*?)()$/其中

  • ()与左侧匹配
  • (.*?)匹配我想要的区域 捕获
  • ()与右侧匹配。

左右两侧是起点和终点。

假设我有这个HTML:

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

现在我需要拔出&#34;可能是任何东西&#34;来自HTML示例,没有&#34;巨大&#34;来自子元素。遵循3部分规则。

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

我的尝试是/^(>)(.*?)(<span)$/,但这不起作用,我也不知道从哪里开始。任何帮助将不胜感激!

编辑:

更清楚地了解我要做的事情。

我正在尝试从网页上返回一些体育统计数据。我使用kimonolabs来抓一个网页。我试图刮擦的元素是一张桌子。这包含一个内部有一些文本。和服使用css选择器来知道要从哪个元素中提取。然后regex是一个过滤其他任何东西的选项。所以现在如果div里面有另一个元素,它会返回那些元素文本,即文本,但我不想要

2 个答案:

答案 0 :(得分:2)

对于这种字符串:

 <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/enter image description here

答案 1 :(得分:2)

<强>更新

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

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

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

这假设它与<div>标记内的内容匹配。


如果HTML代码过于复杂/生病,这就是我提出的正则表达式:

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

这太复杂了。

这适用于格式错误的代码。

它可以根据需要运行:将数据保存在<div>内但在<span>之前。

您可以在此处测试并检查它:https://regex101.com/r/tT1xM4/1


<强>声明

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

不要使用这种复杂数据的注释!

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

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