PHP preg_replace正则过滤字符串代码

风清扬斈 9年前 (2010-08-19) 信息科技 6630 0

preg_replace

(PHP 3>= 3.0.9, PHP 4 )

preg_replace -- 执行正则表达式的搜索和替换

说明

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])   i修正符

subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。

replacement 可以包含 \n 形式或(自 PHP 4.0.4 起)$n 形式的逆向引用,首选使用后者。每个此种引用将被替换为与第 n 个被捕获的括号内的子模式所匹配的文本。n 可以从 0 到 99,其中 \0$0 指的是被整个模式所匹配的文本。对左圆括号从左到右计数(从 1 开始)以取得子模式的数目。

对替换模式在一个逆向引用后面紧接着一个数字时(即:紧接在一个匹配的模式后面的数字),不能使用熟悉的 \1 符号来表示逆向引用。举例说 \11,将会使 preg_replace() 搞不清楚是想要一个 \1 的逆向引用后面跟着一个数字 1 还是一个 \11 的逆向引用。本例中的解决方法是使用 ${1}1。这会形成一个隔离的 $1 逆向引用,而使另一个 1 只是单纯的文字。

例子 1. 逆向引用后面紧接着数字的用法

<?php
$string
= "April 15, 2003";
$pattern = "/(w+) (d+), (d+)/i";
$replacement = "${1}1,$3";
print
preg_replace($pattern, $replacement, $string);

/* Output
   ======

April1,2003

*/
?>

如果搜索到匹配项,则会返回被替换后的 subject,否则返回原来不变的 subject

preg_replace() 的每个参数(除了 limit)都可以是一个数组。如果 patternreplacement 都是数组,将以其键名在数组中出现的顺序来进行处理。这不一定和索引的数字顺序相同。如果使用索引来标识哪个 pattern 将被哪个 replacement 来替换,应该在调用 preg_replace() 之前用 ksort() 对数组进行排序。

例子 2. 在 preg_replace() 中使用索引数组

<?php
$string
= "The quick brown fox jumped over the lazy dog.";

$patterns[0] = "/quick/";
$patterns[1] = "/brown/";
$patterns[2] = "/fox/";

$replacements[2] = "bear";
$replacements[1] = "black";
$replacements[0] = "slow";

print
preg_replace($patterns, $replacements, $string);

/* Output
   ======

The bear black slow jumped over the lazy dog.

*/

/* By ksorting patterns and replacements,
   we should get what we wanted. */

ksort($patterns);
ksort($replacements);

print
preg_replace($patterns, $replacements, $string);

/* Output
   ======

The slow black bear jumped over the lazy dog.

*/

?>

如果 subject 是个数组,则会对 subject 中的每个项目执行搜索和替换,并返回一个数组。

如果 patternreplacement 都是数组,则 preg_replace() 会依次从中分别取出值来对 subject 进行搜索和替换。如果 replacement 中的值比 pattern 中的少,则用空字符串作为余下的替换值。如果 pattern 是数组而 replacement 是字符串,则对 pattern 中的每个值都用此字符串作为替换值。反过来则没有意义了。

/e 修正符使 preg_replace()replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。

例子 3. 替换数个值

<?php
$patterns
= array ("/(19|20)(d{2})-(d{1,2})-(d{1,2})/",
                   
"/^s*{(w+)}s*=/");
$replace = array ("\3/\4/\1\2", "$\1 =");
print
preg_replace ($patterns, $replace, "{startDate} = 1999-5-27");
?>

本例将输出:

$startDate = 5/27/1999

例子 4. 使用 /e 修正符

<?php
preg_replace
("/(</?)(w+)([^>]*>)/e",
              
"(i)\1(i).strtoupper((i)\2(i)).(i)\3(i)",
              
$html_body);
?>

这将使输入字符串中的所有 HTML 标记变成大写。

例子 5. 将 HTML 转换成文本

<?php
// $document 应包含一个 HTML 文档。
// 本例将去掉 HTML 标记,javascript 代码
// 和空白字符。还会将一些通用的
// HTML 实体转换成相应的文本。

$search = array ("(i)<script[^>]*?>.*?</script>(i)si",  // 去掉 javascript
                 
"(i)<[/!]*?[^<>]*?>(i)si",           // 去掉 HTML 标记
                 
"(i)([ ])[s]+(i)",                 // 去掉空白字符
                 
"(i)&(quot|#34);(i)i",                 // 替换 HTML 实体
                 
"(i)&(amp|#38);(i)i",
                 
"(i)&(lt|#60);(i)i",
                 
"(i)&(gt|#62);(i)i",
                 
"(i)&(nbsp|#160);(i)i",
                 
"(i)&(iexcl|#161);(i)i",
                 
"(i)&(cent|#162);(i)i",
                 
"(i)&(pound|#163);(i)i",
                 
"(i)&(copy|#169);(i)i",
                 
"(i)&#(d+);(i)e");                    // 作为 PHP 代码运行

$replace = array ("",
                  
"",
                  
"\1",
                  
""",
                  
"&",
                  
"<",
                  
">",
                  
" ",
                  
chr(161),
                  
chr(162),
                  
chr(163),
                  
chr(169),
                  
"chr(\1)");

$text = preg_replace ($search, $replace, $document);
?>

注: limit 参数是 PHP 4.0.1pl2 之后加入的。

参见 preg_match()preg_match_all()preg_split()

PHP str_replace() 函数

定义和用法

str_replace() 函数使用一个字符串替换字符串中的另一些字符。

语法

str_replace(find,replace,string,count)
参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

提示和注释

注释:该函数对大小写敏感。请使用 str_ireplace() 执行对大小写不敏感的搜索。

注释:该函数是二进制安全的。

例子

例子 1

<?php
echo str_replace("world","John","Hello world!");
?>

输出:

Hello John!

例子 2

在本例中,我们将演示带有数组和 count 变量的 str_replace() 函数:

<?php
$arr = array("blue","red","green","yellow");
print_r(str_replace("red","pink",$arr,$i));
echo "Replacements: $i";
?>

输出:

Array
(
[0] => blue
[1] => pink
[2] => green
[3] => yellow
)
Replacements: 1

例子 3

<?php
$find = array("Hello","world");
$replace = array("B");
$arr = array("Hello","world","!");
print_r(str_replace($find,$replace,$arr));
?>

输出:

Array
(
[0] => B
[1] =>
[2] => !
)
 
eregi_replace 函数详解  
字符串比对解析并取代,与大小写无关。
eregi_replace语法: string eregi_replace(string pattern, string replacement, string string);

eregi_replace返回值: 字符串

函数种类: 资料处理


 
 
eregi_replace内容说明 


本函数和 ereg_replace() 类似,用法也相同。不同之处在于 ereg_replace() 有区分大小写,本函数与大小写无关。


 
 
参考 


ereg()  ereg_replace()  eregi()  

PHP preg_replace正则过滤字符串代码
 $str=preg_replace("/s+/", " ", $str); //过滤多余回车    
$str=preg_replace("/<[ ]+/si","<",$str); //过滤<__("<"号后面带空格)    
$str=preg_replace("/<!–.*?–>/si","",$str); //注释    
$str=preg_replace("/<(!.*?)>/si","",$str); //过滤DOCTYPE    
$str=preg_replace("/<(/?html.*?)>/si","",$str); //过滤html标签    
$str=preg_replace("/<(/?head.*?)>/si","",$str); //过滤head标签    
$str=preg_replace("/<(/?meta.*?)>/si","",$str); //过滤meta标签    
$str=preg_replace("/<(/?body.*?)>/si","",$str); //过滤body标签    
$str=preg_replace("/<(/?link.*?)>/si","",$str); //过滤link标签    
$str=preg_replace("/<(/?form.*?)>/si","",$str); //过滤form标签    
$str=preg_replace("/cookie/si","COOKIE",$str); //过滤COOKIE标签    
$str=preg_replace("/<(applet.*?)>(.*?)<(/applet.*?)>/si","",$str); //过滤applet标签    
$str=preg_replace("/<(/?applet.*?)>/si","",$str); //过滤applet标签    
$str=preg_replace("/<(style.*?)>(.*?)<(/style.*?)>/si","",$str); //过滤style标签    
$str=preg_replace("/<(/?style.*?)>/si","",$str); //过滤style标签    
$str=preg_replace("/<(title.*?)>(.*?)<(/title.*?)>/si","",$str); //过滤title标签    
$str=preg_replace("/<(/?title.*?)>/si","",$str); //过滤title标签    
$str=preg_replace("/<(object.*?)>(.*?)<(/object.*?)>/si","",$str); //过滤object标签    
$str=preg_replace("/<(/?objec.*?)>/si","",$str); //过滤object标签    
$str=preg_replace("/<(noframes.*?)>(.*?)<(/noframes.*?)>/si","",$str); //过滤noframes标签    
$str=preg_replace("/<(/?noframes.*?)>/si","",$str); //过滤noframes标签    
$str=preg_replace("/<(i?frame.*?)>(.*?)<(/i?frame.*?)>/si","",$str); //过滤frame标签    
$str=preg_replace("/<(/?i?frame.*?)>/si","",$str); //过滤frame标签    
$str=preg_replace("/<(script.*?)>(.*?)<(/script.*?)>/si","",$str); //过滤script标签    
$str=preg_replace("/<(/?script.*?)>/si","",$str); //过滤script标签    
$str=preg_replace("/javascript/si","Javascript",$str); //过滤script标签    
$str=preg_replace("/vbscript/si","Vbscript",$str); //过滤script标签    
$str=preg_replace("/on([a-z]+)s*=/si","On\1=",$str); //过滤script标签    
$str=preg_replace("/&#/si","&#",$str); //过滤script标签,如javAsCript:alert(‘aabb)  
 
1.过滤掉 strip_tags($content);  这个是所有标签,都被去掉了
2.按照原样显示
htmlspecialchars($content);
 

php的一些过滤函数2010-03-01 10:19看了很多系统,过滤很重要,是安全的基本保障,不然被注入了,那就完蛋了,

平时总是没时间去总结一下,今天来好好总结一下

首先,要认识几个函数,已经一些变量

magic_quotes_gpc 和magic_quotes_runtime是php为我们提供的两个魔法引用函数

他们的作用是什么呢?他们的作用是在指定的预定义字符前添加反斜杠和取出反斜杠,这些预定义字符为单引号’,双引号",反斜杠,NULL

那么他们有什么区别呢?

magic_quotes_gpc

作用范围:web客户服务端

作用时间:请求开始时

magic_quotes_runtime

作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的结果

作用时间:每次当脚本访问运行状态中产生的数据

所以,magic_quotes_gpc的设定值将会影响通过GET/POST/COOKIES/获得的数据;magic_quotes_runtime的设定值将会影响从文件中读取的数据或从数据库查询得到的数据

例子说明:

<?php
if(empty($_GET[’act’]))
{
?>
<form action="?act=add" method="post">
<input type="text" name="put">
<input type="submit" value="提交">
</form>
<?
}

if($_GET[’act’] == ’add’)
{
echo ’magic_quotes_gpc为off’;
echo ’<br/>’;
echo ’输入框输入的字符为’.$_POST[’put’];
echo ’<br/>’;
echo ’执行addslashes函数后为’.addslashes($_POST[’put’]);
echo ’<br/>’;
echo ’现在保存进数据库’;
echo ’<br/>’;
$db = mysql_connect(’localhost’,’root’,’root’) or die(’数据库连接失败’);
mysql_select_db(’gaoyi’,$db) or die(’选择表失败’);
if(mysql_query("insert into `gao`(put)values(’".$_POST[’put’]."’)"))
echo ’没有转义添加成功’;
else 
{
echo ’没有转义添加失败’;
echo ’<br/>’;
if(mysql_query("insert into `gao`(put)values(’".addslashes($_POST[’put’])."’)"))
echo ’转义之后,添加成功’;
}
}  
?>

执行上面的代码,输入 哈哈哈 得到

magic_quotes_gpc为off
输入框输入的字符为哈哈哈
执行addslashes函数后为哈哈哈
现在保存进数据库
没有转义添加成功

执行上面的代码,输入  abcdef’ghi"klmn  得到

magic_quotes_gpc为off
输入框输入的字符为abcdef’ghi"klmn
执行addslashes函数后为abc\def’ghi"klmn
现在保存进数据库
没有转义添加失败
转义之后,添加成功

这样的对比例子,相信你已经可以明白了,是的当magic_quotes_gpc为on的时候,他会对COOKIE,GET,POST得到的数据自 动进行转义(单引号,双引号,斜杠,以及NULL),当他为OFF的时候,则不会自动转义,需要程序转义,可以使用addslashes函数进行,而且, 当添加数据到数据库中时,如果添加的字段中有为出现单引号的时候,会把sql语句打乱,进而是操作失败,或者编程其他操作,这也是SQL注入的一个方法, 还有,当我们在sql与语句中手动用addslashes转义后,sql语句编程 insert into `gao`(put)values(’abc\def’ghi"klmn’),这样存入数据中中的数据捕获包含斜杠,还是编程原来的abc def’ghi"klmn。

接下来我们再看另一个例子,你就可以明白另一个函数的妙用了

<?php

  echo ’<br/>’;
echo ’magic_quotes_runtime为off’;
$query = mysql_query(’select put from `gao`’);
while($row = mysql_fetch_array($query))
{
echo $row[’put’];
echo ’<br/>’;
}
echo ’现在设置magic_quotes_runtime为ON’;
set_magic_quotes_runtime(1);
echo ’<br/>’;
$result = mysql_query("select put from `gao`");
while($row = mysql_fetch_array($result))
{
echo $row[’put’];
echo ’<br/>’;
}

?>

运行上面的代码,得到

magic_quotes_runtime为off哈哈哈
dfsdsdf’sdf"
dfsdsdf’sdf"
abcdef’ghi"klmn
哈哈哈
abcdefghi"klmn
abcdef’ghi"klmn
abcdef’ghi"klmn
abcdef’ghi"klmn
aaa’aaa"aaaaaa
abcdef’ghi"klmn
abcdef’ghi"klmn
现在设置magic_quotes_runtime为ON
哈哈哈
dfsd\sdf’sdf"
dfsd\sdf’sdf"
abc\def’ghi"klmn
哈哈哈
abcdefghi"klmn
abc\def’ghi"klmn
abc\def’ghi"klmn
abc\def’ghi"klmn
aaa’aaa"aaa\aaa
abc\def’ghi"klmn
abc\def’ghi"klmn

可以很明显的看到,当magic_quotes_runtime为off的时候,从数据读出来的数据如果出现单引号,双引号,斜杠,都会按原来输 出,但是当通过set_magic_quotes_runtime(1)把magic_quotes_runtime设为ON的时候,从数据库得到的数据 中的单引号,双引号,斜杠都会被转义,这样,大家应该很明白这两个函数的意义了,如果要修改magic_quotes_runtime可以通过 set_magic_quotes_runtime(0或者1)的设置,可以通过get_magic_quotes_tuntime()来获得当前的值, 而magic_quotes_gpc的值可以同get_magic_quotes_gpc来获得,目前还不知道怎么改变他的值

 当magic_quotes_gpc和magic_quotes_runtime的值为OFF的时候,对数据的过滤由我们自己来进行了,

可以利用两个函数来进行

addslashes(str)对str中的预定义字符进行转义,str必须为字符串,如果为数组,需自行遍历

stripslashes(str)对str中的斜杠进行去除,不管是被转义才加上去的,都会被删除

 这里再介绍一个过滤函数htmlspecialchars()函数,用来对预定义的字符转换成html实体

预定义字符为

& (和号) 成为&amp;

" (双引号) 成为&quot;

’ (单引号) 成为&#039;

< (小于) 成为&lt;

> (大于) 成为&gt;

htmlspecialchars(str,quotestyle,character) 其中str为需要转换的字符串,quotestyle规定如何编码单引号和双引号,有三个值可以选择,

ENT_COMPAT-默认。仅编码双引号

ENT_QUOTES-编码双引号和单引号

ENT_NOQUOTES-不编码任何引号

character为可选的参数,表示规定使用的字符集 
 

"

相关推荐

  • 网友评论

    • (*)

    最新评论