似乎在stackoverflow上的每个问题中,提问者使用regex从HTML中获取一些信息,将不可避免地有一个“答案”,说不要使用regex解析HTML。
为什么不呢?我知道有一些所谓的“真正的”HTML解析器,比如Beautiful Soup,我相信它们是强大而有用的,但如果您只是在做一些简单、快速或简单的事情,那么当一些正则表达式语句就可以很好地工作时,为什么要麻烦使用如此复杂的东西呢?
此外,是否只是因为我不理解正则表达式的某些基本原理,才使得它们在解析中成为一个糟糕的选择?
似乎在stackoverflow上的每个问题中,提问者使用regex从HTML中获取一些信息,将不可避免地有一个“答案”,说不要使用regex解析HTML。
为什么不呢?我知道有一些所谓的“真正的”HTML解析器,比如Beautiful Soup,我相信它们是强大而有用的,但如果您只是在做一些简单、快速或简单的事情,那么当一些正则表达式语句就可以很好地工作时,为什么要麻烦使用如此复杂的东西呢?
此外,是否只是因为我不理解正则表达式的某些基本原理,才使得它们在解析中成为一个糟糕的选择?
当前回答
这个表达式从HTML元素中检索属性。它支持:
未加引号/加引号的属性, 单引号/双引号, 属性中的转义引号, 等号周围的空格, 任意数量的属性, 只检查标签内的属性, 转义注释,以及 在一个属性值中管理不同的引号。
(?:\<\!\-\-(?:(?!\-\-\>)\r\n?|\n|。)*?-\-\>)|(?:<(\ S+)\s+(?=.*>)|(?<=[=\s])\G)(?:((?:(?!\s|=).)*)\s*?=\ s*?[\"']?((?:(?<=\"))(?:(?<=\\)\"|[^\"])*|(?<=')(? : (?<=\\)'|[^'])*)|(?:(?!\"|')(?:(?!\/>|>|\s).)+)[\ "']?\s*)
来看看。在演示中,使用“gisx”标志效果更好。
其他回答
问题是,大多数用户问的问题都与HTML和正则表达式有关,因为他们找不到自己的正则表达式。然后,必须考虑使用DOM或SAX解析器或类似的东西是否会更容易一些。它们是为处理类似xml的文档结构而优化和构造的。
当然,有些问题可以用正则表达式轻松解决。但重点在于容易。
如果您只想找到所有看起来像http://.../的url,那么使用regexp是没问题的。但是如果你想要找到a- element中所有具有'mylink'类的url,你可能最好使用合适的解析器。
这个表达式从HTML元素中检索属性。它支持:
未加引号/加引号的属性, 单引号/双引号, 属性中的转义引号, 等号周围的空格, 任意数量的属性, 只检查标签内的属性, 转义注释,以及 在一个属性值中管理不同的引号。
(?:\<\!\-\-(?:(?!\-\-\>)\r\n?|\n|。)*?-\-\>)|(?:<(\ S+)\s+(?=.*>)|(?<=[=\s])\G)(?:((?:(?!\s|=).)*)\s*?=\ s*?[\"']?((?:(?<=\"))(?:(?<=\\)\"|[^\"])*|(?<=')(? : (?<=\\)'|[^'])*)|(?:(?!\"|')(?:(?!\/>|>|\s).)+)[\ "']?\s*)
来看看。在演示中,使用“gisx”标志效果更好。
两个简单的原因:
编写一个能够抵御恶意输入的正则表达式是困难的;比使用预先构建的工具难多了 编写一个正则表达式来处理你不可避免地会遇到的荒谬的标记是困难的;比使用预先构建的工具难多了
关于正则表达式在解析中的适用性:它们并不合适。您是否见过解析大多数语言所需的正则表达式类型?
正则表达式并不是为处理嵌套的标记结构而设计的,要处理真正HTML中可能出现的所有边缘情况,往好里说是复杂的(往坏里说是不可能的)。
正则表达式对于HTML这样的语言来说还不够强大。当然,有一些例子可以使用正则表达式。但通常不适合进行解析。