检测string中的HTML标签

我需要检测一个string是否包含HTML标签。

if(!preg_match('(?<=<)\w+(?=[^<]*?>)', $string)){ return $string; } 

上面的正则expression式给了我一个错误:

 preg_match() [function.preg-match]: Unknown modifier '\' 

我不正确的正则expression式,所以不知道是什么问题。 我试图逃避\它没有做任何事情。

有没有比正则expression式更好的解决scheme? 如果不是的话,使用preg_match的正确的正则expression式是什么?

简单的解决scheme是:

 if($string != strip_tags($string)) { // contains HTML } 

这对正则expression式的好处是它更容易理解,但我不能评论任何解决scheme的执行速度。

你需要用某个字符或另一个字符来“分隔”正则expression式。 尝试这个:

 if(!preg_match('#(?<=<)\w+(?=[^<]*?>)#', $string)){ return $string; } 

这个函数将search某些html标签并将它们封装在括号中 – 这是非常没有意义的 – 只需将其修改为您想要对标签执行的任何操作即可。

 $html = preg_replace_callback( '|\</?([a-zA-Z]+[1-6]?)(\s[^>]*)?(\s?/)?\>|', function ($found) { if(isset($found[1]) && in_array( $found[1], array('div','p','span','b','a','strong','center','br','h1','h2','h3','h4','h5','h6','hr')) ) { return '[' . $found[0] . ']'; }; }, $html ); 

正则expression式的解释:

 \< ... \> //start and ends with tag brackets \</? //can start with a slash for closing tags ([a-zA-Z]+[1-6]?) //the tag itself (for example "h1") (\s[^>]*)? //anything such as class=... style=... etc. (\s?/)? //allow self-closing tags such as <br /> 

我会使用strlen()因为如果你不这样做,那么一个字符的比较就可以完成,而且速度可能很慢,尽pipe我希望比较一旦发现差异就会退出。

一般来说parsingHTML是一个难题,这里有一些很好的材料:

  • parsingHTML Cthulhu的方式
  • parsing:超越正则expression式

但是关于你的问题(“更好”的解决scheme) – 可以更具体地说明你正在努力实现什么,以及你可以使用哪些工具?

如果你不擅长正则expression式(像我一样),我会发现很多正则expression式库,通常帮助我完成任务。

这里是一个小的教程,将解释你在php做什么。

这是我所指的那些图书馆之一 。

如果目的只是检查string是否包含html标签。 不pipehtml标签是否有效。 那你可以试试这个

 function is_html($string) { // Check if string contains any html tags. return preg_match('/<\s?[^\>]*\/?\s?>/i', $string); } 

这适用于所有有效或无效的html标签。 你可以点击https://regex101.com/r/2g7Fx4/3来查看;