| 
                         | 
                    
                              1 
                        
                        
                                  38
                             
                            如果你 坚持 在使用正则表达式时,在大多数情况下,这样的方法都会奏效: 
  说明: 
  但实际上,为了避免一些麻烦,可以使用解析器。CPAN有几个合适的模块。下面是一个使用 HTML::TokeParser 功能极其强大的模块 HTML::Parser CPAN分布: 
  
   
    HTML::分析器
   
   接受文件名、打开的文件句柄或字符串形式的输入。将上述代码封装在库中,并使目标可配置(即,不仅仅是
     | 
                
| 
                         | 
                    
                              2 
                        
                        
                                  16
                             
                            在我看来,试图用HTML解析器以外的任何东西来解析HTML只是在自找麻烦。HTML是一个 真正地 复杂语言(这是创建XHTML的主要原因之一,XHTML比HTML简单得多)。 例如: 
  是一个完整、100%格式良好、100%有效的HTML文档。(好吧,它缺少DOCTYPE声明,但除此之外……) 它在语义上等价于 
  但它仍然是你必须处理的有效HTML。你 可能会 当然,设计一个正则表达式来解析它,但是,正如其他人已经建议的那样,使用实际的HTML解析器要容易得多。  | 
                
| 
                         | 
                    
                              3 
                        
                        
                                  14
                             
                            我想到了这个: 
  现在,这将处理具有或不具有属性的p标签和结束的p标签,但将匹配具有或没有属性的前标签和类似标签。 它不会去掉属性,但我的源数据不会把它们放进去。我可能会在以后更改它,但现在这就足够了。  | 
                
| 
                         | 
                    
                              4 
                        
                        
                                  5
                             
                            
   我使用了Xetius正则表达式,它工作得很好。除了一些flex生成的标签,它们可以是:
    
  我用它来清除flex生成的html文本中的标签,所以我还添加了更多例外标签: 
 
 | 
                
| 
                         | 
                    
                              5 
                        
                        
                                  4
                             
                            
   不知道你为什么要这样做——用于HTML净化的正则表达式并不总是最好的方法(你需要记住净化属性等,删除javascript:hrefs等)。..但是,一个正则表达式来匹配不是的HTML标签
    
    详细: 
 
 | 
                
| 
                         | 
                    
                              6 
                        
                        
                                  3
                             
                            Xetius重新提出了这个古老的问题,因为它有一个没有提到的简单解决方案。(在为某人做研究时发现了你的问题 regex bounty quest .) 关于使用正则表达式解析html的所有免责声明,这里有一个简单的方法。 
  看这个 live demo 参考  | 
                
| 
                         | 
                    
                              7 
                        
                        
                                  2
                             
                            由于HTML不是一种正则语言,我不希望正则表达式在匹配它方面做得很好。他们可能能胜任这项任务(尽管我不相信),但我会考虑其他地方;我确信perl一定有一些现成的库来操纵HTML。 不管怎样,我认为你想要匹配的是</?(p.+|.*)(\s*.*)>非贪婪地(我不知道perl正则表达式语法的变幻莫测,所以我无法进一步解释)。我假设\ s表示空白。也许事实并非如此。无论哪种方式,您都需要一些与标记名中空格偏移的属性相匹配的东西。但这比这更困难,因为人们经常在脚本和注释中放入无括号的尖括号,甚至可能引用属性值,而你不想与之匹配。 所以正如我所说,我真的不认为regexps是完成这项工作的合适工具。  | 
                
| 
                         | 
                    
                              8 
                        
                        
                                  2
                             
                            
 HTML不是,但HTML标签是,它们可以用正则表达式充分描述。  | 
                
| 
                         | 
                    
                              9 
                        
                        
                                  1
                             
                            假设这将在PERL中工作,就像在声称使用PERL兼容语法的语言中一样: 
    编辑: 
   但这与a不匹配
    也许是这个? 
  
   这应该包括
     | 
                
| 
                         | 
                    
                              10 
                        
                        
                                  1
                             
                            您可能还希望在p标签中的“p”之前允许空白。不确定多久会遇到这种情况,但是<p>;是完全有效的HTML。  | 
                
| 
                         | 
                    
                              11 
                        
                        
                                  1
                             
                            原始正则表达式可以轻松使用: 
  问题是/?(或?)在断言失败后放弃了匹配的内容。在它周围使用非回溯组(?>…)可以确保它永远不会释放匹配的斜线,因此(?!p)断言始终锚定在标记文本的开头。 (也就是说,我同意通常用正则表达式解析HTML不是正确的做法)。  | 
                
| 
                         | 
                    
                              12 
                        
                        
                                  0
                             
                            试试这个,它应该奏效: 
  说明:它可以匹配除p之外的单个字母,后跟可选的空格和更多字符,也可以匹配多个字母(至少两个)。 
   /EDIT:我在中添加了处理属性的能力
     | 
                
| 
                         | 
                    
                              13 
                        
                        
                                  0
                             
                            这对我来说是可行的,因为上述所有解决方案对于以p开头的其他html标签都失败了,比如param-prepress等。它还处理html属性。 
 
 | 
                
| 
                         | 
                    
                              14 
                        
                        
                                  -1
                             
                            您可能还应该删除<p>;标签,因为坏人可以做这样的事情: 
  最简单的方法是使用人们在这里建议的正则表达式来搜索<p>带有属性的标签,并将其替换为<p>;没有属性的标签。只是为了安全起见。  | 
                
| 
                         | 
                    Manny · 如何比较Perl中的字符串? 3 年前 | 
| 
                         | 
                    BioRod · 我不能用Perl打印键和值 3 年前 | 
| 
                         | 
                    user17227456 · Perl CLI代码无法追加字符串行 3 年前 | 
| 
                         | 
                    LearnToBeBetter · 读取文件,搜索字符串,打印字符串 3 年前 | 
                         
                     | 
                    KJ7LNW · 一些波斯语文本的宽字符印刷,但其他文本则没有 3 年前 | 
| 
                         | 
                    con · 如何搜索大型数据结构并返回一系列给出特定值的键/数组? 3 年前 | 
| 
                         | 
                    Pranay Nanda · 使用regex解析许可证文件 7 年前 |