JavaScript正则表达式:匹配非HTML标签部分的文本

6
我希望你能提供一个在node.js中可执行的正则表达式(不包括jQuery DOM处理等,因为标签可能有不同的嵌套),该表达式可以将所有不是HTML标签或其一部分的文本匹配成单独的组。
例如,我想从该字符串中匹配出“5”、“ELT.”、“SPR”、“ ”、“plo”、“Unterricht”、“ ”、“&nbsp”和“plo”。
<tr class='list even'>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <span style="color: #010101">5</span>
    </td>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <b><span style="color: #010101">ELT.</span></b>
    </td>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <b><span style="color: #010101">SPR</span></b>
    </td>
    <td class="list" style="background-color: #FFFFFF" >&nbsp;</td>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <strike><span style="color: #010101">pio</span></strike>
    </td>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <span style="color: #010101">Unterricht</span>
    </td>
    <td class="list" style="background-color: #FFFFFF" >&nbsp;</td>
    <td class="list" style="background-color: #FFFFFF" >&nbsp;</td>
    <td class="list" align="center" style="background-color: #FFFFFF" >
        <b><span style="color: #010101">pio</span></b>
    </td>
</tr>

我可以保证标签内没有">"。
我找到的解决方案是(?<=^|>)[^><]+?(?=<|$),但在node.js中无法使用(可能是因为lookaheads?它说“无效组”)。
有什么建议吗?(是的,我真的认为正则表达式是正确的方法,因为HTML可能以不同的方式嵌套,并且内容始终具有相同的顺序,因为它是一个表格)

2
我喜欢链接到这个网址 https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - NimChimpsky
这是您正在寻找的吗?https://dev59.com/k3RA5IYBdhLWcg3wzhNY - Rusty Fausak
1
你不能使用正则表达式来解析HTML(这就是@NimChimpsky给你的链接的重点),因为HTML不是一种正则语言。任何试图仅使用正则表达式来解析HTML的尝试都将失败。你别无选择,只能实际解析HTML。 - T.J. Crowder
我认为我链接的问题中第二个答案有这样的解决方案。 - Rusty Fausak
至于问题本身... iStefo,JS中的前瞻工作正常 - 问题在于后顾。因此,您可以匹配 (?:^|>)[^<>]+(?=<|$),然后对每个项目将 ^> 替换为空字符串 - 当然,要记住正则表达式并不保证是做到这一点的最佳方法,并且在输入不可预测时,您几乎肯定会在某些时候得到不正确的匹配。 - Peter Boughton
显示剩余5条评论
2个回答

3

尝试使用 'yourhtml'.replace(/(<[^>]*>)/g,' ')

'<tr class="list even"><td class="list" align="center" style="background-color: #FFFFFF" ><span style="color: #010101">5</span></td><td class="list" align="center" style="background-color: #FFFFFF" ><b><span style="color: #010101">ELT.</span></b></td><td class="list" align="center" style="background-color: #FFFFFF" ><b><span style="color: #010101">SPR</span></b></td><td class="list" style="background-color: #FFFFFF" > </td><td class="list" align="center" style="background-color: #FFFFFF" ><strike><span style="color: #010101">pio</span></strike></td><td class="list" align="center" style="background-color: #FFFFFF" ><span style="color: #010101">Unterricht</span></td><td class="list" style="background-color: #FFFFFF" > </td><td class="list" style="background-color: #FFFFFF" > </td><td class="list" align="center" style="background-color: #FFFFFF" ><b><span style="color: #010101">pio</span></b></td></tr>'.replace(/(<[^>]*>)/g,' ')

这将给出一个以空格分隔的文本,您可以在空格上拆分它(以匹配所需内容)。


好的,我会这样做,谢谢。但是我会使用一个漂亮的UTF-8字符或其他东西,因为我认为我的值可能也包含空格... - iStefo

2
也许你可以直接使用标签本身来分割:
html.split(/<.*?>/)

接下来你需要从结果中移除空字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接