正則表達式學習筆記2

1.前言

以前的一篇文章主要是對正則表達式的基礎知識的記錄,不過實踐方能出真知,接下來主要要結合具體的例子進行學習的。正則表達式

2.具體實踐

(注:在正則表達式中 "/" 是在某些語言中做爲開始和結束定界符的標誌存在的)json

(1) 手機號檢驗:

正則表達式:/^1[3456789]\d{9}$/
詳解:
  • "^1" 表明從字符串開始的位置進行匹配的,開頭必須是"1";
  • "[3456789]"表明規定第二位要從這裏面選擇;
  • "\d{9}$" 表明剩下的9位純數字
運行代碼:
$regex = '/^1[3456789]\d{9}$/';
$mobileList = array(
   '15168901234',
   '123456',
   '12345678901',
   '25168901234',
);
foreach ($mobileList as $mobile) {
   if (preg_match($regex, $mobile)) {
       echo $mobile . "| 是正確的手機號\n";
   } else {
       echo $mobile . "| 不是手機號\n";
   }
}
複製代碼
運行結果:
15168901234| 是正確的手機號
123456| 不是手機號
12345678901| 不是手機號
25168901234| 不是手機號
複製代碼

(2)提取cookies

正則表達式:'/(?<=user=)"?[|\d:=a-zA-Z]{1,}/'
詳解:
  • '(?<=user=)'使用的是反向確定預查,從'user='處開始匹配查找字符串(注:預查表示非獲取匹配,匹配內容不會使用)
  • '"?' 表示有子表達式'"'零次或者一次
  • '[|\d:=a-zA-Z]{1,}' 以後內容包含'|'、':'、數字、大小寫字符至少一次
運行代碼
$header = 'HTTP/1.1 200 OK Date: Wed, 23 May 2018 01:42:48 GMT Content-Type: application/json; charset=utf-8 Content-Length: 57 Connection: keep-alive Set-Cookie: user="2|1:0|10:157XXXXX368|4:user|16:MDXXXXXg0MzY5|f80558eXXXXXXXXXX94b3a";';

$regex = '/(?<=user=)\"?[\|\d\:\=a-zA-Z]{1,}/';

preg_match($regex, $header, $matches);

var_dump(trim($matches[0], "\""));

複製代碼
運行結果

2|1:0|10:157XXXXX368|4:user|16:MDXXXXXg0MzY5|f80558eXXXXXXXXXX94b3abash

(3)獲取url信息

正則表達式:'/^(\w+)://([^/:]+)(:\d*)?([^ ]*)/$'
詳解:
  • '(\w+)' 第一部分由多個字母、數字、下劃線構成
  • '://' 第一部分與第二部分分隔爲'://'
  • '([^/:]+)' 第二部分使用的是負值字符範圍,除了'/'、':'外均可以匹配
  • '(:\d*)?' 第三部分爲':'開始,數字重複零次或者屢次,第三部分總體重複零次或者一次
  • '([^ ]*)' 第四部分使用的是負值字符範圍,除了空格全部均可以匹配
運行代碼
$regex = '/^(\w+):\/\/([^\/:]+)(:\d*)?([^# ]*)/';
$url = "https://juejin.im/user/59bf3ba9518825231f64bd05/posts";
preg_match($regex, $url, $matches);
var_dump($matches);
複製代碼
運行結果
array(5) {
  [0]=>
  string(53) "https://juejin.im/user/59bf3ba9518825231f64bd05/posts"
  [1]=>
  string(5) "https"
  [2]=>
  string(9) "juejin.im"
  [3]=>
  string(0) ""
  [4]=>
  string(36) "/user/59bf3ba9518825231f64bd05/posts"
}
複製代碼

(4)提取標籤

正則表達式:'/^<(\w+)\s*/?>\w*(?:</\1>|)$/'
詳解:
  • '<(\w+)\s*/?>' 第一部分由<+多個字母、數字、下劃線+'/'(0或1次)+>構成
  • '\w*' 第二部分隔爲標籤中間內容
  • '(?:</\1>|)' 第三部分'(?:)'爲非獲取匹配模式,'<'+'/'+第一個小括號的值+'>'或者空
運行代碼
$regex = '/^<(\w+)\s*\/?>\w*(?:<\/\1>|)$/';
$string = "<span></span>";
preg_match($regex, $string, $matches);
var_dump($matches);
複製代碼
運行結果
array(2) {
  [0]=>
  string(14) "<span/></span>"
  [1]=>
  string(4) "span"
}
複製代碼

亮點是 "\1" 獲取第一個小括號裏面的匹配值,第一次看到這種用法,學習了!cookie

3.我的感覺

在開發過程當中遇到須要正則表達式的時候,通常會選擇上網查找相似的,而後就開始逐步進行調試直到符合預期要求,雖然最終也能夠解決問題,可是每每會耗費大量時間。因而下定決心要搞懂正則表達式,因此就有兩篇記錄學習過程的筆記。 通過學習雖不能說之後直接能夠寫出要用的表達式,可是能夠大幅下降調試的時間。app

相關文章
相關標籤/搜索