精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
preg_replace 基礎入門應用
$str="as2223adfsf0s4df0sdfsdf";
echo preg_replace("/0/","",$str); //去掉0字符,此時相當于 replace的功能, preg_replace("/0/","A",$str);  這樣就是將0變成A的意思了
echo preg_replace("/[0-9]/","",$str);   //去掉所有數字
echo preg_replace("/[a-z]/","",$str); //這樣是去掉所有小寫字母
echo preg_replace("/[A-Z]/","",$str); //這樣是去掉所有大寫字母
echo preg_replace("/[a-z,A-Z]/","",$str); //這樣是去掉所有字母
echo preg_replace("/[a-z,A-Z,0-9]/","",$str); //去掉所有字母和數字
經過以上的例子,相信大家知道,[ ] 和里面的, 有什么作用了。匹配的字符串必須加 / / (看例子的第一個參數)
繼續深一點的例子:
$str="acsdcs<55555555>sc<6666>sdcd";
echo preg_replace("/<.*>/","",$str); //這個是表示去除以<開頭,以>結尾的那部份,輸出結果是:acsdcssdcd
注意:上面的 .* 是表示任何字符,也就是說不管<>包住的是什么都去掉 其中. 表示任意字符, * 表示任意個數
現在我們來改動一下,如果不想是任何個數呢?
$str="acsdcs<55555555>sc<6666>sdcd";
echo preg_replace("/<.{4}>/","",$str);    //此時輸出: acsdcs<55555555>scsdcd 因為{4}指定了條件:<>內為4個字符的才滿足條件,所以<55555555>不符合條件,沒有被替換。
注意:這時我們又學到了一個知識點{數字} 表示指定前面的個數,*就表示是任意個(0--無限個)
表示重復次數的除了 *, {指定次數} 表示,還有很多表達形式:
$str="acsdcs<55555555>sc<6666>sd<>cd";
echo preg_replace("/<[0-9]*>/","",$str);   //輸出acsdcscd
echo "<hr>";
echo preg_replace("/<[0-9]+>/","",$str); //輸入acsdcsscsd<>cd
上面的例子只要是為了 表達 * 與+的區別 , * 表示重復0數或n 次,而+ 表示1次以上,即一例中<[0-9]+ >表示<>里面至少要有一個數字才符合條件。
為什么上例中用* 和用+輸出的結果不同了吧
再來:
$str="acsdcs<55555555>sc<6666>sd<>cd";
echo preg_replace("/<[0-9]?>/","",$str);    //輸出acsdcs<55555555>sc<6666>sdcd
看[0-9]? 這里的?表示要是0次或1 次,超過1次又不符合條件了。
總結一下,上面我們學會了 * + ? 和大括號{}表示重復次數的方法。
{}表示次數還可以再復雜點:
$str="acs<22>dcs<55555>sc<333>sd<4444>cd&quot;;
echo preg_replace("/<.{3,5}>/","",$str);   //輸出結果:acs<22>dcsscsdcd
上式表示只要是3至5次都符合條件,<22>就不符合條件了,所以沒有被替換
再來學多幾個正則表達式的元字符:
$str="sfsdf3333sdfsd222fsdf666sdf";
echo preg_replace("/[0-9]*/","",$str);   //去除所有字符
可能每次都用[0-9]表示數字有點麻煩,所以正則用了個 \d表示數字。因此上面可以改成:
echo preg_replace("/\d*/","",$str);
$str="sfsdf3333s dfsd222fsd f666sdf";
echo preg_replace("/\s*/","",$str);       //輸出sfsdf3333sdfsd222fsdf666sdf
\s 在這里表示空格的意思
還有一些轉義字符,大家可以自己試下:
\w 表示字母或數字或下劃線或漢字 //這個容易理解
\b 表示單詞的開頭或結束 //這個有點難理解,什么是單詞的開頭?
看例:
$str="applegone open";
echo preg_replace("/o*/","",$str); // 替換字符的o字符,結果會輸出:applegne pen
$str="applegone open";
echo preg_replace("/\bo*/","",$str); // 這時是輸出applegone pen ,第一個o并沒有被替換,為什么呢? 因為 \bo 指明了o必須是單詞的開頭才符合條件。
OK,看到這里,明白什么叫單詞的開頭了吧?
繼續
$str="applegone open go";
echo preg_replace("/o|g/","",$str); //o|g 中間的|表示或者的意思, 此句的的意思是替換o或者g
$str="applegone open go";
echo preg_replace("/\bo|o\b/","",$str); //輸出applegone pen g 因為上面說過了,\b 可以表示單詞的開頭或結尾,
因此上例的意思是替換在單詞開頭的o或在單詞結尾的o
繼續
^ 是表示字符串開頭的意思,$表示字符串的結尾的意思
$str="applegaone an apple open go";
echo preg_replace("/\ba/","",$str); //結果輸出:pplegaone n pple open go 替換了單詞的開頭的a
echo preg_replace("/^a/","",$str); //結果輸出:pplegaone an apple open go 只替換了字符串開頭的 a
如果明白了^ , 也會明白了 $ 的意思了吧? ^ 表示字符串的開頭,$表示字符串的結尾。
時候,我們需面對一種特殊的情況,請看下例:
$str="a2b333a56b33b";
echo preg_replace("/a.*b/","",$str); //本來是想替換 a2b 和a56b的,但輸出結果卻是空白
想一下,為什麼上例輸出結果是空白呢? 因為整個字符串是以a 開頭,以b結尾。所以把整個字符串都替換了。
當一個表達式既符合短字符串的匹配,又符合長字符串的匹配,正則表達式在默認情況,是匹配最長的那個,這種情況叫做正則表達式貪婪匹配
即匹配盡量多的字符。
加深一下理解,再試下下面幾個例:
$str="abb3";
echo preg_replace("/a.*b/","",$str); //輸出3 , 按照貪婪匹配的原則, a.*b 匹配的是abb,而不是ab
$str="aabb5"; //嵌套的情況,
echo preg_replace("/a.*b/","",$str); // 輸出5,按照貪婪匹配的原則, a.*b 匹配的是aabb,而不是中間的ab
可能這時候你會問,如果我真想替換是中間的ab字符,而不想替換aabb呢,那么你又需要學習:懶惰匹配
$str="5abb5";
echo preg_replace("/a.*?b/","",$str); //輸出5b5 , *?表示匹配任意的次,但盡量少, 所以只替換5abb5中的ab,而不是abb
$str="5a1b22b5";
echo preg_replace("/a.*?b/","",$str); //輸出 522b5 *?匹配最少的那個 a1b,而不是 a1b22b
注意:懶惰匹配是指嵌套情況下的最少重復。
請看下例:
$str="5a1ba22b5";
echo preg_replace("/a.*?b/","",$str); //輸出結果是55, a1b 和a22b并不是嵌套關系,所以這個不能用懶惰匹配來解釋,此例可以看作是替換了a1b和a22b。
總結一下:貪婪匹配匹配盡量多的字符,懶惰匹配匹配盡量少的字符
懶惰匹配還有其它的表達方式:
*? 重復任意次,但盡可能少重復
+? 重復1次以上,但盡可能少重復
重復0次或1次,但盡量少重復
{n,m}? 重復n到m次,但盡量少重復
{n,}? 重復n次以上,但盡量少重
懶惰匹配還有個特殊的情況:
$str="aabab";
echo preg_replace("/a.*?b/","",$str); //此時輸出的結果是空白
為什么上例中a.*?b 替換了整個字符串? 其實,并不是因為替換了整個字符串,而是 替換了aab 和ab
具體實例:
去掉所有HTML標識
假如你有一份HTML
<html>
<head>
<title></title>
</head>
<body>
<font color="#ff0000">PHP正則表達式</font>
<a class='a1' href="">Click Here</a>
</body>
</html>
當你用PHP的 file_get_contents 把它全部讀入了 一個字符串 $str之后。
如果你只需要這份文件里面的文字,不要其它HTML標記。如何去掉呢?
先分析一下,不管什么HTML標記,都有個特點:以<開頭,以> 結尾,我們只需要去掉以<開頭,以> 結尾的字符即可
可能你會想到用以下的表達式
$str= preg_replace("/<.*>/","",$str); // 這樣可不行。為什么?試驗一下,看下例:
$str="111<div>333</div>88";
echo preg_replace("/<.*>/","",$str); //結果輸出 11188, 它把333也去掉了,我們只想去掉<div></div>標記,但根據貪婪匹配的原理,這個表達式會去掉:<div>333</div>
那么,我們改為使用懶惰匹配
$str="111<div>333</div>88";
echo preg_replace("/<.*?>/","",$str); //結果輸出:11133388 正是我們想要的結果
有時候,HTML標記常會出現嵌套的現象:
$str="111<div>3<div>444</div>33</div>88";;
echo preg_replace("/<.*?>/","",$str); //結果輸出:11134443388 也是我們想要的結果
去掉超級鏈接
如果我們并不想去掉超級鏈接,而是想去掉超級鏈接標識呢?
先分析一下超鏈接標識的特點, <a href="aa.php">Click Herer</a>
還可能有 <a class="a1" href="aa.php">Click Here</a> 或 <a class="a1" href="aa.php" target=_blank >Click Here</a>
還可能有大小寫不同的情況 <A HREF="aa.php">Click Herer</a>
不管什么情況, 肯定是 <a 開頭 里面含有 href字眼
$str="111<a href=''></a>88";
echo preg_replace("/<a href=''>/i","",$str); //這樣輸出的結果是111</a>88 ,而沒有去掉</a>
改進一下:
$str="111<a href=''></a>88";
echo preg_replace("/<a href=''>|<\/a>/i","",$str); // </a>要用<\/a>表示,加斜杠表轉義,否則會出錯的, 加i是為了不區分大小寫
上例中輸出了11188 ,是正確去掉超鏈接標識了,但上例的表達式壯健性太差了,稍有變化,就會出錯。
稍變一下:
$str="111<a href=''></a>88"; // 如果href 前面多幾個空格
echo preg_replace("/<a href=''>|<\/a>/i","",$str); //輸出111<a href=''>88, 這樣就出錯了。
因此我們再將其改進一下:
$str="111<a href=''></a>88";
echo preg_replace("/<a href=''>|<\/a>/i","",$str);
作業題:
下面是一條壯健性比較好的替換超鏈接代碼的表達式, 好好分析一下
echo preg_replace("/<a\s+href=[^>]*>|<\/[^a]*a[^>]*>/i","",$str);
----------------------------
PS:上面去掉超鏈接的,只是學習作用,在實際上,用起來,還是不好用,我再找了兩個,還可以用的
echo preg_replace("/<a[^>]*?>(.*)<\/a>/si","\\1",$str);
echo preg_replace("#<a .+>(.*)<\/a>#iU","\\1",$str);
這兩個,就不會出錯。
PHP 正則表達式
正則字符正則解釋
\將下一個字符標記為一個特殊字符、或一個原義字符、或一個向后引用、或一個八進制轉義符。例如,“\n”匹配字符“n”。“\\n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。
^匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。
$匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。
*匹配前面的子表達式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等價于{0,}。
+匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。
匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等價于{0,1}。
{n}n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。
{n,}n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。
{n,m}m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o。“o{0,1}”等價于“o?”。請注意在逗號和兩個數之間不能有空格。
當該字符緊跟在任何一個其他限制符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o?”將匹配單個“o”,而“o+”將匹配所有“o”。
.點匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“[\s\S]”的模式。
(pattern)匹配pattern并獲取這一匹配。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。
(?:pattern)匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。
(?=pattern)正向肯定預查,在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。
(?!pattern)正向否定預查,在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。
(?<=pattern)反向肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
(?<!pattern)反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
x|y匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。
[xyz]字符集合。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]負值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。
[a-z]字符范圍。匹配指定范圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符。注意:只有連字符在字符組內部時,并且出兩個字符之間時,才能表示字符的范圍; 如果出字符組的開頭,則只能表示連字符本身.
[^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\r\n\t\v]。
\S匹配任何非空白字符。等價于[^ \f\r\n\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匹配版權符號(?)。
上表是正則表達式比較全面的解釋,而商標中的正則字符都有特殊含義,已經不再代表原字符含義。如正則表達式中“+”不代表加號,而是代表匹配一次或多次。而如果想要讓“+”表示加號,則需要在其前面加上“\”轉義,也就是用“\+”表示加號。
三個常用的知識點:
1.惰性匹配:正則引擎默認是貪婪的,若要最少重復的話,需要用到惰性匹配符 “”
懶惰限定符
代碼/語法
說明
*?重復任意次,但盡可能少重復
+?重復1次或更多次,但盡可能少重復
重復0次或1次,但盡可能少重復
{n,m}?重復n到m次,但盡可能少重復
{n,}?重復n次以上,但盡可能少重復
參考:http://deerchao.net/tutorials/regex/regex.htm#greedyandlazy
2.不捕獲性匹配: 一方面不占用反向應用組號,另一方面提高了匹配效率
(?:exp)        // 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
參考:http://deerchao.net/tutorials/regex/regex.htm#backreference
3.PHP正則表達式模式修飾符詳解
模式修正符號功能描述
i在和正則匹配是不區分大小寫
m將字符串視為多行。默認的正則開始“^”和結束“$”將目標字條串作為一單一的一“行”字符(甚至其中包括換行符也是如此)。如果在修飾符中加上“m”,那么開始和結束將會指點字符串的每一行的開頭就是“^”結束就是“$”。
s如果設定了這個修正符,那么,被匹配的字符串將視為一行來看,包括換行符,換行符將被視為普通字符串。
x忽略空白,除非進行轉義的不被忽略。
e只用在preg_replace()函數中,在替換字符串中逆向引用做正常的替換,將其(即“替換字符串”)作為PHP代碼求值,并用其結果來替換所搜索的字符串。
A如果使用這個修飾符,那么表達式必須是匹配的字符串中的開頭部分。比如說”/a/A”匹配”abcd”。
D模式中的$字符權匹配目標字符的結尾。沒有此選項時,如果最后一個字符是換行符的話,美元符號也會匹配此字符之前。如果設定了修正符m則忽略此項。
E與”m”相反,如果使用這個修飾符,那么”$”將匹配絕對字符串的結尾,而不是換行符前面,默認就打開了這個模式。
U貪婪模式,和問號的作用差不多,最大限度的匹配就是貪婪模式。
常用的元字符代碼說明
.匹配除換行符(\r\n,\r,\n)以外的任意字符
\w匹配字母或數字或下劃線或漢字
\s匹配任意的空白符,包括空格、制表符(Tab)、換行符、中文全角空格等
\d匹配數字
\b匹配單詞的開始或結束
^匹配字符串的開始
$匹配字符串的結束
本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
php_正則表達式_歡歡和芳芳的天空
PHP匹配連續的數字或字母的正則表達式
關于正則表達式中^和$
php中常用的正則表達式的介紹及應用實例代碼
Shell正則表達式 & Grep正則表達式 & shell字符串處理
php中正則的使用
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 洪雅县| 民乐县| 伊宁县| 庆城县| 牡丹江市| 绍兴市| 澄迈县| 大姚县| 百色市| 通辽市| 天津市| 吉首市| 铁岭县| 营口市| 阿拉善左旗| 开远市| 麟游县| 新化县| 承德市| 九寨沟县| 社旗县| 德安县| 沧州市| 全州县| 南京市| 剑川县| 阜新市| 邓州市| 辛集市| 会同县| 东乡| 鹰潭市| 澎湖县| 江陵县| 策勒县| 齐河县| 裕民县| 和顺县| 辉县市| 都兰县| 安吉县|