【问题标题】:Regex text between tags not found [duplicate]未找到标签之间的正则表达式文本[重复]
【发布时间】:2013-05-28 13:32:18
【问题描述】:

我正在尝试在 html 标记的内容/文本中匹配单词 contact。我可以获取标签之间的所有文本:

http://rubular.com/r/IkhG2nhmnS

与:

(?<=\"\>)(.*?)(?=\<\/)

但我只想搜索单词contact,它不起作用:

http://rubular.com/r/We44nHisLf

与:

(?<=\"\>)(contact*?)(?=\<\/)

谁能指导我如何在 html 标签的文本/内容中匹配我想要的单词。在上述情况下,我想查找/匹配单词contact

感谢您的帮助

【问题讨论】:

  • 您不想使用正则表达式来匹配 HTML 标签。真的。你没有。
  • 嗯,20 多年的编程经验,正则表达式的高级知识,我知道我在说什么。如果您有无限的堆栈和格式良好的输入,那么使用 HTML 解析器进行解析就可以了。如果您对库的访问受限并且知道会发生什么或需要更多类似模糊的匹配,则使用正则表达式进行解析很好。但是因为我的经验而对我投反对票是非常不成熟的。坦率地说,对任何真正贡献知识的人投反对票是令人反感的。
  • @PP 你必须明白这个话题已经在这个网站上讨论过extensively。是的,给定一组有限的、可知的输入,使用正则表达式解析 HTML 是 possible。然而,已经提供了大量证据表明它只是isn't a good idea
  • @PP 贡献知识和提供坏建议之间存在细微差别。从技术上讲,您可以用牙刷粉刷房间,但这仍然不是一个好的提示。批评是有序的,“是的,但它有效,我已经做到了!” 不会是相关的回复。除非你只有牙刷,这种情况很少见。 I know regex to a point 在那里我可以和他们一起做一些非常有趣的事情,并且仍然我会拒绝任何寻求如何解析 HTML 帮助的人。因为这确实是非常糟糕的建议。

标签: php javascript regex


【解决方案1】:

说明

此正则表达式将拉取锚标记中 href 内的所有文本。

&lt;a\b[^&gt;]*?\bhref=(['"])([^'"]*)\1[^&gt;]*?&gt;

组 0 将包含从 &lt;a&gt; 的整个匹配字符串

  1. 收到 href 部分的公开报价。稍后在正则表达式中将其用作 \1 以匹配右引号
  2. 接收href值的内容

免责声明

使用正则表达式可能不是解析 HTML 的好主意,因为有许多边缘情况可能会导致正则表达式出错。

PHP 代码示例:

<?php
$sourcestring="your source string";
preg_match_all('/<a\b[^>]*?\bhref=([\'"])([^\'"]*)\1[^>]*?>/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

$matches Array:
(
    [0] => Array
        (
            [0] => <a href="contact">
        )

    [1] => Array
        (
            [0] => "
        )

    [2] => Array
        (
            [0] => contact
        )

)

总结

  • &lt;a 匹配 &lt;a
  • \b 单词 char (\w) 和 不是单词字符的东西
  • [^&gt;]*? 任何字符,除了:'>'(0 次或多次 (匹配尽可能少的数量))
  • \b 单词 char (\w) 和 不是单词字符的东西
  • href=匹配href=
  • ( 分组并捕获到\1:
  • ['"] 任意字符:''', '"'
  • ) \1 结束
  • ( 分组并捕获到\2:
  • [^'"]* 任何字符,除了:'''、'"'(0 或 更多次(匹配最多的数量 可能))
  • ) \2 结束
  • \1 捕获匹配的内容 \1
  • [^&gt;]*? 任何字符,除了:'>'(0 次或多次 (匹配尽可能少的数量))
  • &gt; 匹配 &gt;
  • )分组结束

【讨论】:

  • 假设上图不是自己手绘的,是怎么生成的?
  • @Verdan:绘儿乐!哈哈哈。但说真的,我正在使用 debuggex.com 。虽然它不支持lookbehinds,但对于理解表达式流仍然很方便。还有 regexper.com。他们也做得很好,但在你输入的时候不是实时的。
  • 非常酷!谢谢!
【解决方案2】:

你可能想要this

(?<=\"\>).*(contact)?(?=\<\/)

您当前的正则表达式:

(?<=\"\>)(contact*?)(?=\<\/)

只会匹配:

<a href="contact">contact</a>

还有……

<a href="contact">contactttt</a>

甚至……

<a href="contact">contac</a>

因为* 仅适用于它前面的t

我的正则表达式中的.* 允许contact 之前的任何字符。

【讨论】:

    【解决方案3】:

    确保在匹配文本之前不会遇到另一个标签的最安全方法是:

    (?<=\"\>)[^<]*(contact)
    

    在哪里

    [^<]* 
    

    表示:(一个不是

    【讨论】:

      【解决方案4】:

      如果你真的必须使用正则表达式来解析 HTML 标签,那么

      (?<=>)[^<]*(contact)[^<]*(?=<\/)
      

      这里是a test。您的比赛在第 1 组。

      但请查看DOM functions,以正确解析结构化文档。

      【讨论】:

        猜你喜欢
        • 2014-07-26
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2019-04-15
        • 2023-03-19
        • 1970-01-01
        • 2012-03-12
        • 2020-10-14
        相关资源
        最近更新 更多