正则表达式匹配 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或其他解析技术。
我正在尝试匹配 <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或其他解析技术。