首頁  >  文章  >  php中的str_replace知識點大全

php中的str_replace知識點大全

PHP中文网
PHP中文网原創
2017-07-23 15:41:582953瀏覽

一php str_replace preg

需要我們用程式處理的資料並不總是預先以資料庫思維設計的,或者說是無法用資料庫的結構去存儲的。 
例如模版引擎解析模版、垃圾敏感資訊過濾等等。 
一般這種情況,我們用正規按我們的規則去匹配preg_match、替換preg_replace。 
但一般的應用中,無非是些資料庫CRUD,正規擺弄的機會很少。 
根據前面說的,兩個場景:統計分析,用匹配;處理用替換。

PHP preg_replace() 正規替換,與Javascript 正規替換不同,PHP preg_replace() 預設是取代所有符號符合條件的元素。

大部分語言的正規表示式都是差不多的,不過也有細微的差異。

PHP 正規表示式

preg_replace (正则表达式, 替换成, 字符串, 最大替换次数【默认-1,无数次】, 替换次数)
符合前面的子表達式零次或一次。 1}。中的“o”,但是能匹配“food”中的兩個o。次。 0,}」則等價於「o*」。m和n均為非負整數,其中n<=m 。注意在逗號和兩個數之間不能有空格。 {n},{n,},{n,m})後面時,匹配模式是非貪婪的。搜尋的字串。 符合pattern並取得此符合。 …$9屬性。若要匹配圓括號字符,請使用“\(”或“\)”。 匹配pattern但不取得匹配結果,也就是說這是一個非獲取匹配,不進行儲存以供以後使用。這在使用或字元“(|)”來組合一個模式的各個部分是很有用。例如「industr(?:y|ies)」就是比「industry|industries」更簡略的表達式。 正向肯定預查,在任何符合pattern的字串開始處符合尋找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,“Windows(?=95|98|NT|2000)”能符合“Windows2000”中的“Windows”,但不能符合“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。 正向否定預查,在任何不符合pattern的字串開始處符合查找字串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如“Windows(?!95|98|NT|2000)”能符合“Windows3.1”中的“Windows”,但不能符合“Windows2000”中的“Windows”。 反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能符合“2000Windows”中的“Windows”,但不能符合“3.1Windows”中的“Windows”。 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?符合x或y。例如,「z|food」能匹配「z」或「food」。 「(z|f)ood」則符合「zood」或「food」。 字元集合。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”。##[^a-z]負值字元範圍。匹配任何不在指定範圍內的任意字元。例如,「[^a-z]」可以符合任何不在「a」到「z」範圍內的任意字元。 \b符合一個單字邊界,也就是指單字和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 \B符合非單字邊界。 “er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 \cx符合由x指明的控製字元。例如,\cM符合一個Control-M或回車符。 x的值必須為A-Z或a-z之一。否則,將c視為一個原義的「c」字元。 \d符合一個數字字元。等價於[0-9]。 \D符合一個非數字字元。等價於[^0-9]。 \f符合一個換頁符號。等價於\x0c和\cL。 \n符合一個換行符號。等價於\x0a和\cJ。 \r符合一個回車符。等價於\x0d和\cM。 \s符合任何空白字符,包括空格、製表符、換頁符等等。等價於[ \f\n\r\t\v]。 \S符合任何非空白字元。等價於[^ \f\n\r\t\v]。 \t符合一個製表符。等價於\x09和\cI。 \v符合一個垂直製表符。等價於\x0b和\cK。 \w符合包括下劃線的任何單字字元。等價於「[A-Za-z0-9_]」。 \W符合任何非單字字元。等價於「[^A-Za-z0-9_]」。 \xn符合n,其中n為十六進位轉義值。十六進制轉義值必須為確定的兩個數字長。例如,“\x41”匹配“A”。 「\x041」則等價於「\x04&1」。正規表示式中可以使用ASCII編碼。 \num符合num,其中num是正整數。對所獲取的匹配的引用。例如,「(.)\1」會符合兩個連續的相同字元。 \n標識一個八進位轉義值或一個向後引用。如果\n之前至少n個取得的子表達式,則n為向後引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。 \nm標識一個八進位轉義值或一個向後引用。如果\nm之前至少有nm個得到子表達式,則nm為向後引用。如果\nm之前至少有n個獲取,則n為一個後面接文字m的向後引用。如果前面的條件都不滿足,若n和m均為八進位數字(0-7),則\nm將符合八進位轉義值nm。 \nml如果n為八進位數字(0-7),且m和l均為八進位數字(0-7),則符合八進位轉義值nml。 \un符合n,其中n是一個用四個十六進位數字表示的Unicode字元。例如,\u00A9符合版權符號(©)。
<?php
$weigeti=&#39;course.html 在线教程网址:http://www.php.cn/course.html&#39;;
echo preg_replace(&#39;/course.html/&#39;,&#39;w3c&#39;,$weigeti);
//大小写不同,输出【w3c 在线教程网址:http://www.php.cn/course.html】
echo preg_replace(&#39;/course.html/i&#39;,&#39;w3c&#39;,$weigeti);
//忽略大小写,执行替换输出【w3c 在线教程网址:http://e.php.cn/w3c/】
echo preg_replace(&#39;/网址/u&#39;,&#39;&#39;,$weigeti);
//强制 UTF-8中文,执行替换,输出【course.html 在线教程:http://www.php.cn/course.html】
?>

大小写和中文在PHP中都是敏感的,但是在Javascript正则中,只对大小写敏感,忽略大小写也是通过修饰符 i 作用的,但是Javascript 不需要告知是否是UTF-8中文等特殊字符,直接可以匹配中文。

PHP 正则换行符实例

PHP 正则表达式在遇到换行符时,会将换行符当做字符串中间一个普通字符。而通用符号.不能匹配\n,所以遇到带有换行符的字符串正则会有很多要点。

<?php
$weigeti="php.cn\nIS\nLOVING\nYOU";
// 想要把上面$weigeti 替换成php.cn
echo preg_replace(&#39;/^[A-Z].*[A-Z]$/&#39;,&#39;&#39;,$weigeti);
// 这个正则表达式是,匹配只包含\w的元素,$weigeti 是以V开头,符合[A-Z],而且结尾是U,也符合[A-Z]。.无法匹配\n
// 输出【php.cn IS LOVEING YOU】
echo preg_replace(&#39;/^[A-Z].*[A-Z]$/s&#39;,&#39;&#39;,$weigeti);
// 这个用修饰符s,也就是 . 可以匹配 \n 了,所以整句匹配,输出空
// 输出【】
echo preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);
// 这里使用了修饰符,将\n作为多行独立匹配。也就等价于:
/* 
$preg_m=preg_replace(&#39;/^[A-Z].*[A-Z]$/m&#39;,&#39;&#39;,$weigeti);
$p=&#39;/^[A-Z].*[A-Z]$/&#39;;
$a=preg_replace($p,&#39;&#39;,&#39;php.cn&#39;);
$b=preg_replace($p,&#39;&#39;,&#39;IS&#39;);
$c=preg_replace($p,&#39;&#39;,&#39;LOVING&#39;);
$d=preg_replace($p,&#39;&#39;,&#39;YOU&#39;);
$preg_m === $a.$b.$c.$d;
*/
// 输出【php.cn】
?>

以后您在使用PHP 抓取某个网站内容,并用正则批量替换的时候,总无法避免忽略获取的内容包含换行符,所以在使用正则替换的时候一定要注意。

PHP 正则匹配执行函数PHP 正则替换可以使用一个修饰符e,代表 eval() 来执行匹配后的内容某个函数。

<?php
$weigeti=&#39;course.html 在线教程网址:http://www.php.cn ,你Jbzj!了吗?&#39;;
// 将上面网址转为小写
echo preg_replace(&#39;/(http\:[\/\w\.\-]+\/)/e&#39;,&#39;strtolower("$1")&#39;,$weigeti);
// 使用修饰符e之后,就可以对匹配的网址执行PHP 函数 strtolower() 了
// 输出 【course.html 在线教程网址:http://www.php.cn ,你Jbzj!了吗?】
?>

根据上面代码,尽管匹配后的函数 strtolower() 在引号内,但是依旧会被eval()执行。

正则替换匹配变量向后引用

如果您熟悉Javascript,一定对$1 $2 $3 …… 等向后引用比较熟悉,而在 PHP 中这些也可以被当作向后引用参数。而在PHP中,还可以使用 \1 \\1 来表示向后引用。

向后引用的概念就是匹配一个大片段,这个正则表达式内部又被用括号切割成若干小匹配元素,那么每个匹配元素就被按照小括号序列用向后引用代替。

复制代码代码如下:

<?php
$weigeti=&#39;course.html 在线教程网址:http://www.php.cn ,你Jbzj!了吗?&#39;;
echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;,&#39;$1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;,&#39;\1&#39;,$weigeti);
echo preg_replace(&#39;/.+(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+/&#39;,&#39;\\1&#39;,$weigeti);
// 上面三个都是输出 【http://www.php.cn】
echo preg_replace(&#39;/^(.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+$/&#39;,&#39;栏目:$1<br>网址:$2<br>商标:$3&#39;,$weigeti);
/*
栏目:course.html 在线教程
网址:http://www.php.cn
商标:Jbzj!
*/
// 括号中括号,外面括号先计数
echo preg_replace(&#39;/^((.+)网址:(http\:[\w\-\/\.]+\/)[^\w\-\!]+([\w\-\!]+).+)$/&#39;,&#39;原文:$1<br>栏目:$2<br>网址:$3<br>商标:$4&#39;,$weigeti);
/*
原文:course.html 在线教程网址:http://www.php.cn ,你Jbzj!了吗?
栏目:course.html 在线教程
网址:http://www.php.cn
商标:Jbzj!
*/
?>

二.php str_replace多次

1、只对needle使用数组。

示例:str_replace(array('m','i'),'n',"my name is jim!");返回:ny nane ns jnn!
可以看出,函数顺序性的对数组中每个字符串进行替换,并返回替换后的字符串。

2、只对new_needle使用数组。

示例:str_replace('m',array('n','z'),"my name is jim!\n")返回:Arrayy naArraye is jiArray!
该替换比较有意思,如果只对第二个参数使用数组则函数将其作为字符串Array进行使用,将所有的needle替换为了数组。

3、只对haystack使用数组。

示例:str_replace("m","n",array("my name is jim!","the game is over!"))该语句执行结果返回一个数组,即分别为传入的两个字符串替换后的结果。
如果输出数组内容会看到:ny nane is jin! the gane is over!

4、对needle和new_needle都使用数组。

示例:str_replace(array("m","i"),array("n","z"),"my name is jim!")返回:ny nane zs jzn!
查看执行结果可以发现,如果前两个参数都使用数组则函数把数组各个对象项字符串进行了替换,及needle的第一项替换为new_needle的第一项。以此类推。

如果needle数组比new_deedle长,例如:str_replace(array("m","i","s"),array("n","z"),"my name is jim!");返回:ny nane z jzn!可见,对于needle数组多出来的字符串被替换为了空串。
如果new_needle数组比needle长,例如:str_replace(array("m","i"),array("n","z","x"),"my name is jim!")返回ny nane zs jzn!可见new_needle多余的项被忽略。

5、三个参数都使用数组。

例如:str_replace(array("m","i"),array("n","z"),array("my name is jim!","the game is over"))返回的数组内容:ny nane zs jzn!the gane zs over
这个比较好理解,对两个字符串分别执行替换。

三.str_replace \\ \

实例

把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":

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

定义和用法

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

该函数必须遵循下列规则:

如果搜索的字符串是数组,那么它将返回数组。

如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。

如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。

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

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

语法

str_replace(find,replace,string,count)
正規字元 正規解釋
#\ 將下一個字元標記為特殊字符、或一個原義字元、或一個向後引用、或一個八進位轉義符。例如,“\n”匹配字元“n”。 “\\n”符合一個換行符號。序列“\\”符合“\”而“\(”則符合“(”。
#^ 符合輸入字串的開始位置。如果設定了RegExp物件的Multiline屬性,^也符合「\n」或「\r」之後的位置。設定了RegExp物件的Multiline屬性,$也符合「\n」或「\r」之前的位置。次或多次。子表達式一次或多次。 #?
{n,m}
符合除“\n”之外的任何單一字符。 ##(pattern)
(?:pattern)
(?=pattern)
(?!pattern)
(?<=pattern)
(?
x|y
[xyz]
[^xyz] 負值字元集合。匹配未包含的任意字元。例如,「[^abc]」可以符合「plain」中的「plin」。
[a-z] 字元範圍。符合指定範圍內的任意字元。例如,「[a-z]」可以符合「a」到「z」範圍內的任意小寫字母字元。注意:只有連字符在字符組內部時,並且出兩個字符之間時,才能表示字符的範圍; 如果出字符組的開頭,則只能表示連字符本身.
参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。对替换数进行计数的变量。


例子 1

使用带有数组和 count 变量的 str_replace() 函数:

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

例子 2

使用带有需要替换的元素少于查找到的元素的 str_replace() 函数:

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


四.php str_irreplace

实例

把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":

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

定义和用法

str_replace() 函数以其他字符替换字符串中的一些字符(区分大小写)。

该函数必须遵循下列规则:

如果搜索的字符串是数组,那么它将返回数组。

如果搜索的字符串是数组,那么它将对数组中的每个元素进行查找和替换。

如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换

如果查找的是数组,而替换的是字符串,那么替代字符串将对所有查找到的值起作用。

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

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

语法

str_replace(find,replace,string,count)


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


例子 1

使用带有数组和 count 变量的 str_replace() 函数:

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

例子 2

使用带有需要替换的元素少于查找到的元素的 str_replace() 函数:

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


五 .php str_split

PHP函数split()的基本语法为:array split ( string $pattern, string $string [, int $limit] )。我们向大家举了两个例子来具体讲解这个函数的使用方法。

对于初学者来说,掌握PHP中常用函数的用法,是其继续学习的基础。今天我们就为大家详细介绍有关PHP函数split()的一些使用方法,希望大家能通过这篇文章介绍的内容增加自己的知识库。
说明

array split ( string $pattern, string $string [, int $limit] )

提示
preg_split() 函数使用了 Perl 兼容正则表达式语法,通常是比PHP函数split()更快的替代方案。如果不需要正则表达式的威力,则使用 explode() 更快,这样就不会招致正则表达式引擎的浪费。
本函数返回一个字符串数组,每个单元为 string 经区分大小写的正则表达式 pattern 作为边界分割出的子串。如果设定了 limit,则返回的数组最多包含 limit 个单元,而其中最后一个单元包含了 string 中剩余的所有部分。如果出错,则 split() 返回 FALSE。
将 /etc/passwd 中的前四个字段分割出来:
例 1839. PHP函数split()例子
深入PHP nl2br()格式化输出的详解

<?php list($user, $pass, $uid, $gid, $extra) =  split (":", $passwd_line, 5);  ?>

如果字符串中有 n 个与 pattern 匹配的项目,则返回的数组将包含 n+1 个单元。例如,如果没有找到 pattern,则会返回一个只有一个单元的数组。当然,如果 string 为空也是这样。
解析可能用斜线,点,或横线分割的日期:
例 1840. PHP函数split()例子

<?php 
   // 分隔符可以是斜线,点,或横线 
   $date = "04/30/1973";  
   list($month, $day, $year) = split (&#39;[/.-]&#39;, $date); 
   echo "Month: $month; Day: $day; Year: $year<br />\n";
?>

想仿效 Perl 中类似的 @chars = split('', $str) 行为,请参考 preg_split() 或 str_split() 函数中的例子。
注意 pattern 是一个正则表达式。如果想要用的分割字符是正则表达式中的特殊字符,要先将其转义。如果觉得PHP函数split()(或其它任何 regex 函数)行为古怪的话,请阅读包含在 PHP 发行包中 regex/ 子目录下的 regex.7 文件。该文件是手册页面格式,可以用类似 man /usr/local/src/regex/regex.7 的命令来阅读

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn