日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进一步的去了解正则[一]

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进一步的去了解正则[一] 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 正則是什么.
? 請先看 http://www.phpchina.com/html/11/n-34811.html 幾k 的解釋后.

原地址已被更改,重新找了一個教程,請點擊。 http://deerchao.net/tutorials/regex/regex.htm

2 實例剖析.
1.??? $str = '<FORM&NBSP;NAME="ADFA"&NBSP;ACTION="ASDF.BPHP"&NBSP;TARGET=""><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP: www.bac.com test.php? target="qwerqwerq"><FORM&NBSP;NAME="BBBB"&NBSP;ACTION="HTTP.PHP"&NBSP;TARGET="QWERQWERQ">';?
2.??? ??? $match = '';?
3.??? ??? preg_match_all('/\s+action=\"(?!http:)(.*?)\"\s/', $str,?????? $match);?
4.??? ??? print_r($match);
/\s+action=\"(?!http:)(.*?)\"\s/ 此正則是用來匹配 action=”xxx” 里面的xxx的.
可講的地方有3
1? \”(.*?)\” 會匹配? aa”abb”aaaa”? 字符串中的”abb””? 而(.*)\” 則會去匹配aa”abb”aaaa”中的”abb”aaaa”. 此謂之貪婪(greedy) 特別實用。U 修正符可以反轉正則式中的貪婪。
2 (?!http:) 代表將要匹配的內容中不含有http: 他本身不匹配內容.
例如 我要匹配一個 長為8-16里面不能有http 的字符串,就寫 (?!http)\w{8-16} 即可。
3 就是這哥們匹配時,定死了action=” 后面的這個(“) 如果是 ‘ 號呢怎么辦呢?
這里就要用到 反向引用了。
相關正則表達式如下。
(?<=\s*action=('|\"))(?!|http)(.*?)(?=\1)
? 演化一下
最初的想法
? Action=\”(.*)\”? => 為能只匹配 action=”dddd” fdsfds” 中的action=”dddd”而不是action=”dddd” fdsfds” 更改為action=\”(.*?)\” =>要支持單引號action=(‘\”)(.*?)\1 => action 后面引號內不允許有http? action=(‘\”)(?!http:)(.*?)\1? => 只想提取引號內的內容,不想提取其它的內容. (?<=\s*action=('|\"))(?!http)(.*?)(?=\1)

文中還有兩個例子挺實用的。
帶斷言的正則匹配
1.??? $match = '';?
2.??? ?? $str = '<A&NBSP;HREF="">xxxxxx.com.cn <b>ddddbolod</b>paragraph text
';?
3.??? ?? preg_match_all ( '/(?<=<(\w{1})>).*(?=<\/\1>)/', $str, $match );?
4.??? ?? echo "<BR&NBSP; />匹配沒有屬性的標簽中的內容:";?
5.??? ?? print_r ( $match );
正則式為(?<=<(\w{1})>).*(?=<\/\1>)
(?<=<(\w{1})>) 為逆向預匹配,就是說需要匹配的左邊要滿足這要求。
上php手冊查了一下,preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

然后表大式可以更改為(?<=<(\w+)>).*(?=<\/\1>)
替換HTML源碼中的地址??
1.??? $form_html = preg_replace ( '/(?<=\saction=\"|\ssrc=\"|\shref=\")(?!http:|javascript)(.*?)(?=\"\s)/e', 'add_url(\$url, \'\\1\')', $form_html );
這個也是單雙引號的問題,需要改改.

2 看完帖http://www.phpchina.com/html/03/n-34203.html
覺得
function is_good_pw($pw) {
??? if(preg_match('/(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}/', $pw)) {
??????? return true;
??? }
??? return false;
}
可以吸收一下。下面我決定啰哩啰嗦的解試一下這個函數。
.{8-16} 代表匹配8-16位非換行字符串。
可是當我們需要這8-16 位的數字中,必須有數字,而且有小寫字母,而且有大寫字母時,正則表達式如何去寫呢?

?(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}
匹配 必須有數字,小寫字母,大寫之母的 的8-16 位的字符.
1 基礎概念講解.
? 1 理解縫隙的概念.
??? 例如, "^","$","\b"。它們都有一個共同點,那就是:它們本身不匹配任何字符,只是對 "字符串的兩頭" 或者 "字符之間的縫隙" 附加了一個條件
?2? ?=xxx) 正向預搜索 代表縫隙的右側,必須能夠匹配上 xxxxx 這部分的表達式
?
那么
(?=.*[\d]).{8-16} 代表匹配含有數字的8-16位的字符串,
如果是(?=\d).{8-16}則匹配的內容為首位為數字的8-16 的字符串.
如果是(?=\d{2}).{8-16}則匹配的內容為前兩位為數字的8-16 的字符串.
從這里看來,正向預搜索需要理解的就是(?=xxx) 本身是不匹配字符的,而是給右側的字符串添加條件,目的就是要右側的字符串能滿足這個預搜索條件。

.{8-16}? 代表任意非換行的8 位字符串.
(?=.*[\d]).{8-16} 代表任意非換行的8-16 位字符串,而且這8-16位字符串中有數字。
(?=.*[\d]) (?=.*[a-z]).{8-16}代表任意非換行的8-16 位字符串,而且這8-16位字符串中有數字,而且這8-16位字符串中有a-z 之間的字母.
這樣看來(?=.*[\d]).{8-16}的(?=.*[\d])就是用來向.{8-16}來疊加規則的.*[\d] 的
(?=.*[a-z]) (?=.*[\d]).{8-16} 中的(?=.*[a-z])就是用來向(?=.*[\d]).{8-16}疊加(?=.*[a-z])規則。
這樣下來,當我們需要匹配的8-16位中間有數字而且有大寫字母而且有小寫字母,的時修就用到了(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).{8,16}

此時,我們能匹配8-16 位的數字中,必須有數字,而且有小寫字母,而且有大寫字母
這時,如果要被匹配的字符串中不能出現 http 這時怎么處理呢?
答案很簡單 加個正向否定預搜索就可以了
(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?!http).{8,16}

下一個實例,貨幣替換.
1 理清思路,
貨幣替換對正則而言就是要找那些 距離結尾或[.] 隔著\d{3}+ 的\d
所以一開始就是(\d)(?=(\d{3})+($|\.\d*))
如果不希望回代后面的值,就用(\d)(?=(?:\d{3})+(?:$|\.\d*))
再補點預搜索條件(?=\d)(?!\.\d*) 是數字,而且不能以 .開頭 最后就拼接成了.
(?<!\.\d*)(?=\d)(\d)(?=(?:\d{3})+(?:$|\.\d*))
附php代碼.




<?php
$money_arr =? array(
??? "0",
??? "12",
??? "123",
??? "1234",
??? "12345",
??? "123456",
??? "1234567",
??? "123456789",
??? "1234567890",
??? "12.345",
??? "123.456",
??? "1234.56",
??? "12345.6789",
??? "123456.789",
??? "1234567.89",
??? "12345678.9",
??? "sdsd12345678.9"
);
?
foreach($money_arr as $key=>$val)
{
??? echo $val;
??? $str = preg_replace("/(?=\d)(?!\.\d*)(\d)(?=(?:\d{3})+($|\.\d*))/","$1,",$val);
??? echo "the replace result is";echo $str;
??? echo "<hr/>";
}

function pr($arr){ //格式化輸出數組.
??? print("<pre>");print_r($arr);print("</pre>");
}
?>

下一例:
<img src=’xxx’>
<img src=’xxx’ />
<img src=’xxx’ > ddd</img>
當需要抓取這三種時,第三種的前面和第一種重復,則用 ? 來解決
<img[^>]>(.*<\/img>)? 即可

轉載于:https://www.cnblogs.com/murain/archive/2010/03/31/1947265.html

總結

以上是生活随笔為你收集整理的进一步的去了解正则[一]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。