亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

PHP正則處理遇到的幾個問題

標簽:
PHP

首先给出几个问题。

  1. 将html代码中的js内容过滤掉。

  2. 将html代码中table标签中间的内容(<table>内容</table>)前后加上特殊字符#。

  3. 取出img标签alt属性的值。

html代码如下:

<html><head>
       <title>test</title></head><body>
       <script type="text/javascript">
              data = 'test data';       </script>
       <p><img class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="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

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消