检测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来查看;