过滤html标签与标签之间的空格以及标签和内容之间的空格

所属栏目:建站技术 更新时间:2020-10-30 点击: 文章来源:https://www.sznest.net/jzjs/3525.html

<?php
ob_start();
?>
<p id="name"> 与左边的右尖括号有一个空格喔  与右边的左尖括号有两个空格喔  </a>
<p>   与左边的右尖括号有三个空格喔</a>
<p>只与右边的左尖括号有四空格喔    </a>
<p>两边没有空格   但是中间有空格喔</a>

<?php
    //过滤换行,删除左尖括号左边的空格,去掉右尖括号右边的空格,但是不过滤连续字符串中的空格

    $text = str_replace(PHP_EOL, '', ob_get_flush());//过滤缓存的换行

    //$pattern1 = '/(?<=\>)([\s]+)(?=\<)/i';//匹配标签之间所有的空格
    //网上有人说这个正则表达式除了可以去掉标签与标签之间的空格之外还可以过滤标签和文本之间的空格,但是经过反复测试,只能清除标签之间所有的空格,并不能去掉标签与文本之间的空格,要实现即过滤标签之间的空白又要删除标签与文本之间的空白还需要通过下面的两个表达式配合来实现

    //匹配左尖括号左边空格
    $pattern2 = '/(?<=[^\s])([\s]+)(?=<)/';

    //匹配右尖括号右边空格
    $pattern3 = '/(?<=>)([\s]+)(?=[^\s])/';

    //如果匹配替换之后中文出现乱码,需对字符串用urlencode编码与urldecode解码处理
    //$pattern2 = '/(?<=[^\+])([\+]+)(?=%3C)/';//匹配左尖括号左边空格
    //$pattern3 = '/(?<=%3E)([\+]+)(?=[^\+])/';//匹配右尖括号右边空格
    //$text=urlencode($text);//空格的url编码是+,左尖括<是%3C,右尖括>是%3E
    //下面是从缓存中获取的数据然后编码之后的结果
    //$str = "%3Cp+id%3D%22name%22%3E+%E4%B8%8E%E5%B7%A6%E8%BE%B9%E7%9A%84%E5%8F%B3%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94++%E4%B8%8E%E5%8F%B3%E8%BE%B9%E7%9A%84%E5%B7%A6%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%A4%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94++%3C%2Fa%3E%3Cp%3E+++%E4%B8%8E%E5%B7%A6%E8%BE%B9%E7%9A%84%E5%8F%B3%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E4%B8%89%E4%B8%AA%E7%A9%BA%E6%A0%BC%E5%96%94%3C%2Fa%3E%3Cp%3E%E5%8F%AA%E4%B8%8E%E5%8F%B3%E8%BE%B9%E7%9A%84%E5%B7%A6%E5%B0%96%E6%8B%AC%E5%8F%B7%E6%9C%89%E5%9B%9B%E7%A9%BA%E6%A0%BC%E5%96%94++++%3C%2Fa%3E%3Cp%3E%E4%B8%A4%E8%BE%B9%E6%B2%A1%E6%9C%89%E7%A9%BA%E6%A0%BC+++%E4%BD%86%E6%98%AF%E4%B8%AD%E9%97%B4%E6%9C%89%E7%A9%BA%E6%A0%BC%E5%96%94%3C%2Fa%3E";
    //echo $text;

    preg_match_all($pattern2,$text, $match2);
    preg_match_all($pattern3,$text, $match3);

    echo "<pre>";
    print_r($match2);//这里匹配到的是左边尖括号的二个与四个空格
    print_r($match3);//这里匹配到的是左边尖括号的一个与三个空格

    $text=preg_replace($pattern2,"",$text);
    $text=preg_replace($pattern3,"",$text);

    //url解码
    //$text=urldecode($text);

    echo $text;
    exit;
?>
如果对上面的正则表达式看不明白,请看下面的两种匹配模式的说明,是从百度百科中摘录下来的,希望对你理解非获取匹配有所帮助!

(?<=pattern)
非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?=pattern)
非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。


注意事项:

如果一个正则表达式中即有正向肯定预查也有反向肯定预查时,反向肯定预查在前面,正向肯定预查只能在后面,就比如匹配右尖括号右边空格的正则表达式正确的是'/(?<=%3E)([\+]+)(?=[^\+])/',而不能是'/(?=%3E)([\+]+)(?<=[^\+])/'


为了更好的理解以上的几个非获取匹配,再链接数据库测试下面的代码
//防止操作另外一个子网站的数据开始
$result = mysqli_query($GLOBALS["conn"], "show tables like '".WebConfig::prefix."%'");
$tables = array();
while ($currow = mysqli_fetch_array($result)) {
    $tables[] = $currow[0];
}
mysqli_free_result($result);
$newTables = array();
foreach ($tables as $value) {
  $newTables[] = str_replace(WebConfig::prefix, "", $value);
}
foreach ($newTables as $value) {
  //$pattern = "/\s+`?([a-z]+_".$value.")`?\s*?\(?/i";//\s+匹配至少一次空格 `?匹配`零次或一次 [a-z]+匹配字母至少一次 \s*?是匹配空格任意多次,后面的?表示是非贪婪匹配,(?匹配左括号零次或一次
  //非获取匹配
  $pattern = "/(?!\s+`?)([a-z]+_".$value.")(?=`?\s*?\(?)/i";//有结果 推荐这个,下面判断的时候用if($match[0])
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?:`?\s*?\(?)/i";//有结果
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?!`?\s*?\(?)/i";//无结果
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?<=`?\s*?\(?)/i";//出错
  //$pattern = "/(?!\s+`?)([a-z]+_".$value.")(?<!`?\s*?\(?)/i";//出错
  preg_match_all($pattern,$exe,$match);
  //pr($match);
  if($match[0])
  {
    if($match[0][0]!=WebConfig::prefix.$value){
      echo "非法操作其它网站表";
      exit;
    }
  }
}

相关阅读

数据库操作工具类SqlHelper

classSqlHelper{public$conn;public$host=&quot;localhost&quot;;public$username=&quot;root&quot;;public$password=&quot;root&quot;;public$dbname=&quot;mydb&quot;;publicfunction__constr…

了解详情 >>

帝国CMS-采集关键的经验总结

采集关键的几个步骤一:先建好栏目二:增加采集节点(需要选择栏目)三:录入节点名称四:如果有很多页,只需录入采集页面地址方式二中的内容地址为https://www.sznest.net/news.asp?big_class_id=3&amp;page=[page]页码从1到多少页之间、间隔倍数为1(这个多少页即被采集的网站的实际页数,注意这里修改后,在采集页面…

了解详情 >>

asp用正则批量替换过滤表中所有行的内容中的图片

SetHF=NewRegExp&#39;建立正则表达式。HF.Pattern=&quot;《img[^&gt;]*&gt;&quot;&#39;设置模式、《请替换成英文的左尖括号。HF.IgnoreCase=True&#39;设置是否区分字符大小写。HF.Global=True&#39;设置全局可用性。Setconn=Server.CreateObject(…

了解详情 >>

如何让你的PHP网站变得更安全

安全配置一(1)打开php的安全模式php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开:safe_mode=on(2)用户组安全当safe_mode打开时,sa…

了解详情 >>

DOS命令批量获取文件夹内的名称及批量修改文件夹内名称

批量提取文件夹内文件名一:在文件夹内新建一个文本文件,名称随便起,这里为了演示,暂时起名叫!!!.TXT,放入下面的内容,!!!!!!.TXT这个是被生成的文件,用于存放文件夹内所有的文件名用的DIR*.*/B&gt;!!!!!!.TXT二:将!!!.TXT文件名的后缀改成.bat,然后双击运行,生成了!!!!!!.TXT文件三:打开!!!!!!.TXT文件…

了解详情 >>

专业的人干专业的事,切莫用exit来干输出的事

专业的人干专业的&quot;事&quot;,切莫用exit来干输出的事在程序测试的过程中为了图片方便经常少写一行echo的代码来运行查看某个变量,在绝大部分的情况下我们传的都是非整数类型的变量,比如字符串等,所以在这样的情况下用exit来输出变量的值是能看到输出结果的,但是如果是整数类型的情况就不一样了,下面通过几个实验来说明一下这个问题第一个实验实参直接是…

了解详情 >>

Copyright @ 2008-2019   www.sznest.net   All rights reserved  网巢网是一家专业为企业提供免费建站、自助建站的模板建站公司     友情链接:香港张元洪律师行   

微信

移动端

客服

顶部