【问题标题】:Building Regular Expression (RegEx) to extract text of HTML tag [duplicate]构建正则表达式(RegEx)以提取 HTML 标记的文本 [重复]
【发布时间】:2010-11-06 21:02:49
【问题描述】:

我正在尝试构建一个正则表达式来提取 HTML 标记内的文本,如下所示。但是,我在正则表达式方面的技能有限,并且在构建字符串时遇到了麻烦。

如何从这个标签中提取文本:

<a href="javascript:ProcessQuery('report_drilldown',145817)">text</a>

这只是页面的 HTML 源代码示例。基本上,我需要一个regex 字符串来匹配<a> 标签内的“文本”。任何人都可以帮助我吗?谢谢你。我希望我的问题没有措辞太可怕。

更新:为了澄清起见,report_drilldown 是绝对的,但我真的不在乎它是否在 regex 中作为绝对存在。

145817 是一个随机的 6 位数字,实际上是一个数据库 ID。 “文本”只是简单的纯文本,所以它不应该是无效的 HTML。另外,大多数人都说在这种情况下最好不要使用正则表达式,那么最好使用什么?非常感谢!

【问题讨论】:

  • 用regex解决解析HTML的问题?现在你有两个问题。
  • 怎么样?我之前在另一个任务非常相似的项目中使用过正则表达式。也许用别的东西来提取标签的文本会更好?
  • 使用正则表达式解析 HTML 通常是一件坏事:stackoverflow.com/questions/701166
  • 使用正则表达式的 HTML 解析不适​​用于无效的 html,即使是有效的 html 案例也会很痛苦。最好在 C# 中使用 Dom Document 实现,并访问特定节点的 textContent[s]。

标签: html regex


【解决方案1】:

答案是……不要!

使用库,例如​​this one

【讨论】:

    【解决方案2】:

    我同意正则表达式可能不是解析这个的最佳方法,但使用反向引用很容易做到:

    <(?<tag>\w*)(?:.*)>(?<text>.*)</\k<tag>>
    

    其中 tagtext 被命名为捕获组。

    帽子提示:expresso 库

    【讨论】:

    • 即使假设输入格式正确(如果不是,这种解析方式可能会失败,或者更糟糕的是,错误地成功),这个示例输入显示了两个问题:1) 文本更多文本。 2) ab。当然,你的答案确实不比我的好,但我会犹豫是否称它很容易完成。正则表达式根本不适合这项工作,即使它偶尔会起作用。
    • 好的。我将继续寻找一种非常“安全”和“好”的方法来处理这种“标签汤”,但现在,由于 R. Pate 的正则表达式正在工作,我将继续使用它,直到找到更好的解决方案。非常感谢大家!!!
    【解决方案3】:
    <a href="javascript:ProcessQuery\('report_drilldown',[0-9]+\)">([^<]*)</a>
    

    这并不能真正解决问题,但可能只是勉强凑合。特别是,它非常脆弱,对标记稍作改动,它就不会匹配。如果report_drilldown 不是绝对的,请将其替换为[^']*,和/或根据需要同时捕获它和数字。

    如果您需要解析 HTML 的东西,那么如果您必须处理标签汤,那将是一场噩梦。如果您使用的是 Python,我建议您使用 BeautifulSoup,但我不知道 C# 有类似的东西。 (有人知道类似的 C# 标签汤解析库吗?)

    【讨论】:

    • HTML 中的属性不应包含
    • 是的,我很抱歉愚蠢的控制台字体把我弄糊涂了——它应该是 ()。感谢您的帮助!
    • 哈,我更新我的帖子,看到你的答案,现在回滚到原来的。
    • 对不起!!!!我的错 - 现在我确信我需要为 CMD 找到更好的字体。谢谢!
    • Lucida Console 和 Envy Code R(在 google 上搜索)对我来说效果很好。
    【解决方案4】:
    <a href\=\"[^\x00]*?\">
    

    应该给你打开标签。

    <\/a>
    

    会给你结束标签。只需提取介于两者之间的内容。但未经测试。

    【讨论】:

    • 你的意思是 \x 而不是 /x?为什么除了 null 之外的任何字符?为什么 = 和 " 被转义了?因为你没有在 sed 样式中使用 / 分隔符,所以转义 / 也有点奇怪。
    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多