java过滤%3c p%3e标签_过滤html标签与标签之间的空格以及标签和内容之间的空格...

ob_start();

?>

与左边的右尖括号有一个空格喔  与右边的左尖括号有两个空格喔 

   与左边的右尖括号有三个空格喔

只与右边的左尖括号有四空格喔   

两边没有空格   但是中间有空格喔

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

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

//$pattern1 = '/(?<=\>)([\s]+)(?=\

//网上有人说这个正则表达式除了可以去掉标签与标签之间的空格之外还可以过滤标签和文本之间的空格,但是经过反复测试,只能清除标签之间所有的空格,并不能去掉标签与文本之间的空格,要实现即过滤标签之间的空白又要删除标签与文本之间的空白还需要通过下面的两个表达式配合来实现

//匹配左尖括号左边空格

$pattern2 = '/(?<=[^\s])([\s]+)(?=

//匹配右尖括号右边空格

$pattern3 = '/(?<=>)([\s]+)(?=[^\s])/';

//如果匹配替换之后中文出现乱码,需对字符串用urlencode编码与urldecode解码处理

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

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

//$text=urlencode($text);//空格的url编码是+,左尖括是%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 "

";

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.")(?

preg_match_all($pattern,$exe,$match);

//pr($match);

if($match[0])

{

if($match[0][0]!=WebConfig::prefix.$value){

echo "非法操作其它网站表";

exit;

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值