Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在HTML中使用正则表达式何时是明智的?_Html_Regex_Parsing - Fatal编程技术网

在HTML中使用正则表达式何时是明智的?

在HTML中使用正则表达式何时是明智的?,html,regex,parsing,Html,Regex,Parsing,虽然regexp绝对不是完全解析HTML文档的正确工具,但我看到很多人盲目地忽视了关于regexp的任何问题,如果他们在建议的文本中看到了一个HTML标记 由于我们看到很多例子表明regexp不是正确的工具,我想问一下您的意见:在什么情况下,简单的模式匹配比使用完整的解析引擎更好?如果您可以保证需要匹配的模式在单个HTML标记中,然后也许你可以创建一个正则表达式来匹配它 换句话说,当您需要一个表达式来查找匹配的标记/结束标记时,以及当您需要匹配的内容可能包含嵌套的标记、注释、CDATA节等时,都

虽然regexp绝对不是完全解析HTML文档的正确工具,但我看到很多人盲目地忽视了关于regexp的任何问题,如果他们在建议的文本中看到了一个HTML标记


由于我们看到很多例子表明regexp不是正确的工具,我想问一下您的意见:在什么情况下,简单的模式匹配比使用完整的解析引擎更好?

如果您可以保证需要匹配的模式在单个HTML标记中,然后也许你可以创建一个正则表达式来匹配它


换句话说,当您需要一个表达式来查找匹配的标记/结束标记时,以及当您需要匹配的内容可能包含嵌套的标记、注释、CDATA节等时,都是如此。

如果您希望使用regexp解析的HTML集已知符合某种模式。e、 如果你知道没有注释掉的HTML,或者复杂的场景等等


e、 g.我经常鼓吹不要在HTML中使用正则表达式,但是如果我有一套我熟悉的HTML,非常简单,并且我可以轻松检查后期操作,那么我对使用正则表达式毫无疑问。

我认为最好的答案是:正则表达式是正确的工具,除非它们不是

我认为如果你能用正则表达式干净有效地解决你的问题,那就去做吧。但是我看到过太多的正则表达式黑客,因为程序员/网页设计师就是很懒


Regex功能强大,是程序员可以学习的最好的工具之一,但您还需要学习何时使用它以及何时使用不同的工具。

如果您使用的信息有规则的语法,那么Regex就很棒。HTML没有规则的语法,所以事情更复杂

如果您完全100%知道您想要的是什么类型的东西,则Regex是合适的-替换:

<tag>Info</tag>
Info

戴夫
在一个你可以完全控制的文档中是有意义的,但是现实生活中的HTML不是这样的。

显然,在最简单的情况下,比如

<a>Test</a>
//匹配
//不匹配

当你知道自己在做什么时


杰夫·阿特伍德(Jeff Atwood)在其名为和的博客文章中对此进行了广泛讨论

“所以,是的,一般来说,在解析HTML时使用正则表达式是个坏主意。我们绝对应该教给新手开发人员这一点。尽管这显然是一份永不停歇的工作。但我们也应该告诉他们解析HTML和处理几个字符串的简单便利之间的真正区别。以及如何判断当前任务的正确方法。”


在上面提到的帖子中可以找到更多细节。

有一件事值得记住,就是有两个主要的原因反对使用正则表达式处理HTML。一个原因与垃圾HTML的可能性有关,它的格式不可预测。这本身就是在处理HTML过程时持怀疑态度的正当理由使用regex,从一开始就抛出了很多用例。问题是这个源经常被用来“把婴儿连同洗澡水一起扔掉”,也经常与第二个主要反对源(通常都没有说出来)混为一谈,尽管它们完全无关

反对意见的另一个主要来源是HTML语言的复杂性超过了“正则表达式”的一些理想化理论概念,这一概念过于笼统,无法应用于许多用例,但通常被广泛应用。反对意见如下:

  • 真理:正则表达式处理正则语法
  • 真理:HTML不是一种常规语法
  • 无法使用正则表达式处理HTML
  • 我认为很多人只是从表面上看这些真理,而没有考虑它们的含义。Bill Karwin在这里的另一个回答中提到了一些HTML不是常规语法的情况,但当上下文是一个具有非常规功能(如反向引用,甚至递归)的“regex”引擎时,这个论点就不成立了。这些功能解决了许多“非常规语法”的异议,但在格式错误的文档上仍然可能失败


    <>这个区别很少被画出来,很少有人指出大多数现代的“正则”表达式库的能力远远超出了常规的语言处理。我认为每当评价“正则”时,这些都是很重要的事情。“用于处理某些HTML的适当工具的表达式。

    您可以在解析您控制的HTML或为特定HTML页面编写解析器时使用regexp。在尝试构建通用解析器时不应该使用regexp。

    我刚刚发现了一个regexp优于html解析器的示例。我需要从一个长页面(8231行,400kb)中提取一些信息,我首先尝试使用。由于中报告的问题,我陷入了困境,于是我选择了另一种方法,我意识到我实际上只需要该文件前416行中包含的信息(约占总数的4%),而将整个DOM加载到内存中看起来就像是巨大的资源浪费

    现在我仍然不知道为什么simplehtmldom在这方面会失败,所以我无法真正比较这两个解决方案的性能,但是regexp版本只加载所需的行数(直到我感兴趣的
      末尾,没有更多),而且速度非常快。

      查看以下答案:有“真实生活”HTML是已知的,也是可预测的,你知道。如果它是其他人任意编辑的东西,那么它就不会被知道。然而,如果有一个程序总是以特定的格式输出,那仍然是“现实生活”,正则表达式可以工作(…直到程序改变)。一般的重言式不是吗
      <a>Test</a>
      
      < A > Test</a>                // match
      < a href="test">   Test</a>   // match
      < A TEST="test"/>             // no match
      < a href="test<">Test</A>     // invalid input - catch that with a regex!