首先给出几个问题。
将html代码中的js内容过滤掉。
将html代码中table标签中间的内容(<table>内容</table>)前后加上特殊字符#。
取出img标签alt属性的值。
html代码如下:
<html><head> <title>test</title></head><body> <script type="text/javascript"> data = 'test data'; </script> <p><img src="http://test.com/1.jpg" alt="this's a description."></p> <table>....</table> <p><img src='http://test.com/2.jpg' alt='other'></p> <script> console.log('statics'); </script></body></html>
第一个问题,很容易写出下面代码:
$html = preg_replace('~<script.*>.+</script>~U', '', $html);
但执行的时候发现并没有过滤掉js代码。
原因是点号(.)元字符匹配除换行符以外的任意字符。js代码是多行的,所以用点号无法匹配,这个坑很浅,我却掉进去了。
解决方法:使用模式修饰符s,此修饰符可以让点号匹配换行符。
$html = preg_replace('~<script.*>.+</script>~Us', '', $html);
执行结果:
第二问题,可以使用php的preg_replace_callback函数。
$html = preg_replace_callback( '~<table>(.+)</table>~Us', function ($matches) { return '#' . $matches[1] . '#'; }, $html);
第三个问题:
preg_match_all('~<img.*alt=[\'"](.+)[\'"]~U', $html, $matches);
执行结果:
发现第一个匹配出错。由于alt属性值可能由双引号或单引号包括的,所以在正则中使用[\’”],但如果alt属性值中有单引号或双引号就会匹配不全,此时可以使用反向引用来解决,好吧,我竟然忘了反向引用。
preg_match_all('~<img.*alt=([\'"])(.+)\1~U', $html, $matches);
作者:zhou
链接:https://www.jianshu.com/p/79cba48bc3ef