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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

正则环视 php,正则表达式基本知识(php)

發布時間:2023/12/15 php 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 正则环视 php,正则表达式基本知识(php) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里的知識點基本上是《正則指引》的讀書筆記,只是每個知識點的示例代碼用php來實現。

1. 字符組

字符組(Character Class)就是一組字符,在正則表達式中,它表示“在同一個位置可能出現的各種字符”。

寫法:[ab]、[314]、[#.?]

字符組的基本用法

[...]

preg_match('/[0123456]/', '5'); // => 1

preg_match('/[abc123]/', '5'); // => 0

范圍表示法(range)

[x-y]表示x到y整個范圍內的字符。如,[0123456789]表示為[0-9],[abcdefghijk]表示為[a-k]。

為什么是[0-9],而不是[9-0]?

因為-表示的范圍一般是根據字符對應的碼值(Code Point)來確定的。典型地有ACSⅡ編碼。在ACSⅡ編碼中,0~9的碼值是48~57,a~z的碼值是97~122,A~Z的碼值是65~90。

preg_match('/[0-9]/', '5'); // => 1

preg_match('/[a-z]/', '5'); // => 0

preg_match('/[0-9a-fA-F]/', '0'); // 16進制

字符組簡記法(shorthands)

提供比范圍表示法更簡潔的表示方法,如\d表示[0-9],\w表示[0-9a-zA-z_]。

php中支持的字符組簡記:

\d 所有的數字,即[0-9]

\D 所有的非數字,與\d互斥

\w 所有的單詞字符(字符、數字、下劃線),即[0-9a-zA-Z_]

\W 所有的非單詞字符,與\W互斥

\s 所有的空白字符,包括空格、制表符、回車符、換行符等空白字符

\S 所有的非空白字符,與\s互斥

preg_match('/\d/', '8'); // => 1

preg_match('/\d/', 'a'); // => 0

preg_match('/\d[a-z]/', 'a'); // => 1

preg_match('/\w/', 'a'); // => 1

preg_match('/\w/', '6'); // => 1

preg_match('/\w/', '_'); // => 1

preg_match('/\s/', ' '); // => 1

preg_match('/\s/', "\t"); // => 1

preg_match('/\s/', "\r"); // => 1

元字符與轉義

在范圍表示法中,字符組中的橫線-不能匹配橫線字符,而是用來表示范圍,這類字符叫做元字符(meta-character)。元字符除了-還有開方括號[、閉剛括號]、^、$等,它們都有特殊的意義。

當元字符想要表示普通字符的含義時(如-就只想表示橫線字符),就需要轉義處理(在元字符前加反斜線字符\)。對于-,有一個例外情況,就是當它緊跟著字符組中的開括號[時,它就表示普通橫線字符,此時不用轉義。

preg_match('/[0\-9]/', "-"); // => 1

preg_match('/[0\-9]/', "8"); // => 0

preg_match('/[0\-9]/', "0"); // => 1

preg_match('/[-09]/', "-"); // => 1

preg_match("/[0\\-9]/", "-"); // => 1

preg_match("/[0\-9]/", "-"); // => 1

仔細看上面第一個表達式和最后兩個表示式。這里要注意:

在php中,字符串既可以用單引號標注也可以用雙引號標注。兩者的主要區別在于,雙引號字符串可以插值,二單引號字符串不能;另外,雙引號字符串會處理字符串轉義,二單引號字符串不會

正則表達式是以字符串的方式提供的。在php中,雙引號字符串本身也有關于轉義的規定(如"\\"、'\r'、"\t"等),因此"0\\-9"與'0\-9'是等價的。

那么最后一個表達式為什么也可以匹配呢?這是因為,盡管php的正則表達式用字符串文字給出,但它與常見的字符串不完全一樣——如果某個轉義序列可以有字符串識別,則對其進行轉義處理;否則,將整個轉義序列“原封不動”地保存下來。

因此,在正則表達式中轉義要小心,在php中,使用單引號字符串來構建正則表達式會比雙引號字符串更簡單明了。

排除型字符組(Negated Character Class)

在方括號[…]中列出希望匹配的所有字符叫做“普通字符組”。在開方括號[之后緊跟一個脫字符^,寫作[^…],表示“在當前位置,匹配一個沒有列出的字符”。例如,[^0-9]匹配非數字字符。

preg_match('/[^0-9][0-9]/', "A8"); // => 1

排除型字符組中的緊跟著開方括號[的脫字符^也是元字符,如果要匹配尖括號字符,需要進行轉義處理。但是,不緊跟著開方括號[的^就是普通字符,不需要轉義。

preg_match('/[^0-9]/', '0'); // => 0

preg_match('/[\^0-9]/', '0'); // => 1

preg_match('/[\^0-9]/', '^'); // => 1

preg_match('/[0-9^]/', '^'); // => 1

POSIX字符組

之前介紹的字符組,都屬于Perl衍生出來的正則表達式流派(Flavor),這個流派叫做PCRE(Per Compatible Regular Expression)。正則表達式還有其他流派,比如POSIX(Portable Operating System Interface for unix),它是一系列規范,定義了UNIX操作系統應當支持的功能,其中也包括了正則表達式的規范。

常見的[a-z]形式的字符組,在POSIX規范中仍然獲得支持,稱作POSIX方括號表達式。POSIX方括號表達式中的\不是用來轉義的,如[\d]就只能匹配\和d兩個字符。這里涉及到]、-這兩個特殊字符,在POSIX規范中,緊接在開方括號[之后的]才表示閉方括號字符,緊挨在閉方括號]之前的-才表示橫線字符。

對于PCRE規范中的\d、\w、\s等字符組簡記法,POSIX中有類似的東西,叫做POSIX字符組。在ASCⅡ語言環境(locale)中,常見的POSIX字符組及其含義如下:

POSIX字符組

說明

ACSⅡ字符組

等價的PCRE簡記法

[:alnum:]

字母和數字

[0-9a-zA-Z]

[:alpha:]

字母

[a-zA-Z]

[:ASCⅡ]

ASCⅡ字符

[\x00-\x7F]

[:blank:]

空格字符和制表字符

[ \t]

[:cntrl:]

控制字符

[\x00-\x1F\x7F]

[:digit:]

數字字符

[0-9]

\d

[:graph:]

空白字符之外的字符

[\x21-\x7E]

[:lower:]

小寫字母字符

[a-z]

[:print:]

類似[:graph:],但包括空白字符

[\x20-\x7E]

[:punct:]

標點符號

[][!"#$%&'()*+,./:;<=>?@\^_`{\

}~-]

[:space:]

空白字符

[ \t\r\n\v\f]

\s

[:upper:]

大寫字母

[A-Z]

[:word:]

字母字符

[A-Za-z0-9_]

\w

[:xdigit:]

十六進制字符

[A-Fa-f0-9]

php中有專門處理POSIX正則的函數,但從5.3.0開始已經廢棄了。這里只是了解一下相關知識。

2. 量詞

這里首先介紹一下^和$兩個特殊字符,在上一章的元字符與轉義一節提到過這兩個特殊字符。

^放在正則表達式的開頭,表示“定位到字符串的起始位置”;$用在正則表達式的末尾,表示“定位到字符串的結束位置”。

preg_match('/\w\d/', '1a2b'); // => 1

preg_match('/^\w\d/', '1a2b'); // => 0 必須以字母開頭

preg_match('/\w\d$/', '1a2b'); // => 0 必須以數字結尾

preg_match('/^\w\d/', 'a2b'); // => 1

preg_match('/\w\d$/', '1a2'); // => 1

preg_match('/^\w\d$/', '1a2'); // => 0 開頭必須是字母,結尾必須是數字

preg_match('/^\w\d$/', 'a2'); // => 1

量詞的一般形式

如果要匹配一個郵政編碼(6位數字),目前能寫出來的正則表達式是^\d\d\d\d\d\d$:

preg_match('/^\d\d\d\d\d\d$/', '100010'); // => 1

preg_match('/^\d\d\d\d\d\d$/', '10001035'); // => 0

preg_match('/^\d\d\d\d\d\d$/', '10a010'); // => 0

\d重復6次的寫法很不科學,正則表達式肯定會有更方便的寫法,也就是量詞(quantifier)。量詞的通用形式是{m,n}(注意,,后面不能有空格),它限定之前的元素能夠出現的次數,m是下限,n是上限。其他常見的量詞形式有:

量詞

說明

{n}

之前的元素必須出現n次

{m,n}

之前的元素最少出現m次,最多出現n次

{m,}

之前的元素最少出現m次,出現次數無上限

{0,n}

之前的元素可以不出現,也可以出現,最多出現n次

preg_match('/^\d{6}$/', '100010'); // => 1

preg_match('/^\d{4,6}$/', '123'); // => 0

preg_match('/^\d{4,6}$/', '1234'); // => 1

preg_match('/^\d{4,6}$/', '123456'); // => 1

preg_match('/^\d{4,6}$/', '1234567'); // => 0

常用量詞

正則表達式還有三個常用的量詞,分別是+、?、*:

常用量詞

{m,n}等價形式

說明

*

{0,}

可能出現,也可能不出現,出現次數沒有上限

+

{1,}

至少出現1次,出現次數沒有上限

?

{0,1}

出現0次或1次

這三種量詞在實際中使用的非常多。

例如,匹配url的時候,有可能是http,也有可能是https,這個時候用?就很方便:

preg_match('/^https?:\/\/www\.baidu\.com/', 'http://www.baidu.com'); // => 1

preg_match('/^https?:\/\/www\.baidu\.com/', 'https://www.baidu.com'); // => 1

在匹配html的tag(如

、、等)的時候,在中間會有字符,但是字符長度不確定。這種情況下就需要使用+了:

preg_match('/^]+>$/', ''); // => 1

preg_match('/^]+>$/', ''); // => 1

preg_match('/^]+>$/', '<>'); // => 0

如果說匹配一個雙引號字符串,在雙引號內,既可以出現字符也可以不出現字符。這種情況下就應該使用量詞*。

preg_match('/^\"[^\"]*\"$/', '""'); // => 1

preg_match('/^\"[^\"]*\"$/', '"abcd"'); // => 1

點號

點號.是與量詞搭配比較多得一個字符。一般情況下,點號.可以匹配除了換行符\n以外的任意字符。

preg_match('/^.$/', 'z'); // => 1

preg_match('/^.$/', '8'); // => 1

preg_match('/^.$/', "\n"); // => 0

如果要使.能匹配的字符包含換行符\n,可以使用自制通配符\s\S或\w\W、\d\D。

preg_match('/^[\s\S]$/', "\n"); // => 1

使.能匹配的字符包含換行符\n的另外一種方法是指定正則匹配時使用單行模式。在php中,可以使用模式修飾符和預定義常量兩種方法來指定單行模式。關于正則匹配的模式,后面會詳細介紹。

preg_match('/(?s)^.$/', "\n"); // => 1 模式修飾符

preg_match('/^.$/s', "\n"); // => 1 預定義常量

匹配優先量詞、忽略優先量詞

很多語言中,都可以使用/*...*/來注釋代碼,如果是一個支持語法高亮的文本編輯器就要能夠提取/*...*/注釋塊。很easy的,我們可以寫出如下正則表達式:

$str = '/*this is a comment*/ /*this is another comment*/';

preg_match('/\/\*.*\*\//', $str, $arr);

echo $arr[0];

/*this is a comment*/ /*this is another comment*/

可以看到,這個正則表達式出了點小問題,它把兩個注釋塊匹配出來了,如果兩個注釋塊中間有代碼,那么代碼也會匹配出來。

這是因為,我們介紹的*、+、?都是匹配優先量詞(greedy quantifier,也稱貪婪量詞)。匹配優先量詞是指在拿不準是否要匹配的時候,優先嘗試匹配。因此,$str中間的*/ /*都被.*匹配了。

正則表達式中利用忽略優先量詞來解決上述問題。與*、+、?對應的忽略優先量詞的形式是*?、+?、??。忽略優先量詞在不確定是否要匹配時選擇“不匹配”的狀態。還是以提取注釋塊的代碼為例:

preg_match('/\/\*.*?\*\//', $str, $arr);

echo $arr[0];

/*this is a comment*/

這樣就達到了提取注釋塊的效果。

匹配優先量詞

忽略優先量詞

限定次數

*

*?

可能出現,可能不出現,出現次數沒有上限

+

+?

至少出現1次,沒有上限

?

??

出現0次或1次

{m,n}

{m,n}?

出現次數大于等于m,小于等于n

{m,}

{m,}?

至少出現m次,沒有上限

{0,n}

{0,n}?

出現0次-n次

php中有指定非貪婪匹配模式的模式修飾符和預定義常量,與忽略優先量詞是一樣的效果:

// 默認貪婪匹配

preg_match('/\/\*.*\*\//', $str, $arr); // => /*this is a comment*/ /*this is another comment*/

// 預定義常量 指定非貪婪匹配

preg_match('/\/\*.*\*\//U', $str, $arr); // => /*this is a comment*/

// 模式修飾符 指定非貪婪匹配

preg_match('/(?U)\/\*.*\*\//', $str, $arr); // => /*this is a comment*/

// 同時使用 忽略優先量詞 和 預定義常量

preg_match('/\/\*.*?\*\//U', $str, $arr); // => /*this is a comment*/ /*this is another comment*/

// 同時使用 忽略優先量詞 和 模式修飾符

preg_match('/(?U)\/\*.*?\*\//', $str, $arr); // => /*this is a comment*/ /*this is another comment*/

量詞的轉義

*、+、?的轉義比較簡單,就是\*、\+、\?。主要是{m,n}形式的轉義需要注意。

量詞

轉義

量詞

轉義

量詞

轉義

{n}

\\{n}

*

\*

*?

\*\?

{m,n}

\\{m,n}

+

\\+

+?

\\+\?

{m,}

\\{m,}

?

\?

??

\?\?

{0,n}

\\{0,n}

3.括號

分組

上一章介紹了量詞,上一章的例子中量詞都只能控制它前面的字符或字符組。那么量詞能否控制連續的字符或字符組呢,如控制一個單詞hello出現或者不出現。這就要用到正則表達式的分組功能(子表達式),使用圓括號(...)實現分組(子表達式)。

// 量詞限定前面一個字符

preg_match('/^hello?, world$/', 'hello, world'); // => 1

preg_match('/^hello?, world$/', 'hell, world'); // => 1

preg_match('/^hello?, world$/', ', world'); // => 0

// 量詞限定一個單詞

preg_match('/^(hello)?, world$/', 'hello, world'); // => 1

preg_match('/^(hello)?, world$/', 'hell, world'); // => 0

preg_match('/^(hello)?, world$/', ', world'); // => 1

多選結構

多選結構(alternative)的形式是(...|...),在括號內以豎線|分開多個子表達式,這些子表達式也叫多選分支(option)。

例如,匹配常見的11位手機號

// 匹配常見11位手機號

preg_match('/(13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1

引用分組

正則表達式會保存每個(...)分組匹配的文本,這種功能叫捕獲分組(capturing group)。在需要直接使用子表達式的時候非常有用

例如,提取標簽中的地址和描述文本

// 提取標簽中的地址和描述文本

preg_match('/(.*?)/', 'visit github', $arr);

print_r($arr);

/*

Array

(

[0] => github

[1] => github.com

[2] => visit github

)

*/

正則表達式替換時也支持捕獲分組。php中支持\num和$num的形式替換,但是num不能大于10;另一種形式${num}可以大于10。

例如,日期的替換

// 正則表達式替換

preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '$1年$2月$3日', '2015-08-25'); // => 2015年08月25日

preg_replace('/(\d{4})-(\d{2})-(\d{2})/', '\1年\2月\3日', '2015-08-25'); // => 2015年08月25日

反向引用

在正則表達式內部引用之前的捕獲分組匹配的文本叫反向引用(back-reference)。實測php支持\num形式的反向引用,不支持$num形式的反向引用

例如,利用反向引用匹配id相同的不同標簽

// 匹配id為main的標簽

preg_match('/.*?/', '

hello, world', $arr); // => 1

print_r($arr);

/*

Array

(

[0] =>

hello, world

[1] => div

)

*/

// 匹配id為main的標簽

preg_match('/.*?/', '

Hello, World

', $arr); // => 1

print_r($arr);

/*

Array

(

[0] =>

Hello, World

[1] => p

)

*/

命名分組

數字編號的分組有時候不夠直觀,因此有些語言和工具的正則表達式提供了命名分組(named grouping)。

正則字符中(?P)來命名,(?P=name)來使用。preg_replace替換時不支持

// 捕獲命名分組

preg_match('/[^\'"\s]*)">(?P.*?)/', '', $arr);

print_r($arr);

/*

Array

(

[0] => visit github

[link] => github.com

[1] => github.com

[description] => visit github

[2] => visit github

)

*/

// 反向引用命名分組

preg_match('/[\w]+)\s+id="main">.*?/', '

hello, world', $arr);

print_r($arr);

/*

Array

(

[0] =>

hello, world

[tag] => div

[1] => div

)

*/

非捕獲分組

正則表達式默認會保存每個(...)匹配的文本,前面利用這個特性可以實現一些有用的功能。但是,有時候正則表達式比較復雜,(...)會出現的比較多,而此時僅僅是想實現分組或者多選的功能,而不需要捕獲分組;同時,大量不需要的捕獲分組可能會影響性能。

為了解決這種問題,正則表達式提供了非捕獲分組(non-capturing group),它的形式是(?:...)。

// 捕獲分組

preg_match('/(13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1

print_r($arr);

/*

Array

(

[0] => 18521510001

[1] => 185

)

*/

// 非捕獲分組

echo preg_match('/(?:13[0-9]|15[0-356]|18[025-9])\d{8}/', '18521510001', $arr); // => 1

print_r($arr);

/*

Array

(

[0] => 18521510001

)

*/

4.斷言

正則表達式中的有些結構不匹配真正的文本,只負責判斷在某個位置左/右側的文本是否符合要求,這種結構稱為斷言(assertion)。常見的斷言有三類:單詞邊界、行起始/結束位置、環視。

單詞邊界

單詞邊界(word boundary),記為\b。它匹配的是單詞邊界(一邊是單詞字符,另一邊不是單詞字符)的位置,而不是字符。

// 單詞邊界

preg_match('/\b\w+\b/', 'word', $arr); // => 1

print_r($arr);

/*

Array

(

[0] => word

)

*/

// 匹配所有單詞邊界

preg_match_all('/\b\w+\b/', 'hello, world', $arr); // => 2

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => hello

[1] => world

)

)

*/

這類匹配位置而不匹配字符的元素叫做錨點(anchor),下一節要介紹的^、$等也是錨點。

行起始/結束位置

^:字符串的開始位置

$:字符串的結束位置

$str = 'first line

second line

last line';

// 字符串起始位置

preg_match_all('/^\w+\b/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => first

)

)

*/

// 字符串結束位置

preg_match_all('/\b\w+$/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => line

)

)

*/

如果指定了多行模式(Multiline Mode),^、$分別可以匹配行起始位置、行結束位置。關于模式,將在下一章詳細介紹。指定多行模式的方式是使用模式修飾符(?m):在正則表達式之前加上(?m);或者是預定義常量的方式:/.../m 。

// 多行模式 行起始位置

// preg_match_all('/^\w+\b/m', $str, $arr); 是一樣的效果

preg_match_all('/(?m)^\w+\b/', $str, $arr); // => 3

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => first

[1] => second

[2] => last

)

)

*/

//多行模式 行結束位置

// preg_match_all('/\b\w+$/m', $str, $arr); 是一樣的效果

preg_match_all('/(?m)\b\w+$/', $str, $arr); // => 3

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => line

[1] => line

[2] => line

)

)

*/

\A不論是普通模式還是多行模式,都匹配字符串起始位置

\Z、\z不論是普通模式還是多行模式,都匹配字符串結束位置

\Z與\z的區別在于最后字符串的末尾是行終止符的時候,\Z匹配行終止符之前的位置,\z則不管行終止符,只匹配“整個字符串的結束位置”。

這里用行終止符,而不用換行符的原因是不同操作系統的行終止符不同(windows\r\n,linux\n,mac\n)。

// \A 始終匹配字符串起始位置

preg_match_all('/\A\w+\b/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => first

)

)

*/

preg_match_all('/(?m)\A\w+\b/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => first

)

)

*/

// \Z始終匹配行結束位置

preg_match_all('/\b\w+\Z/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => line

)

)

*/

preg_match_all('/(?m)\b\w+\Z/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => line

)

)

*/

// \Z \z的區別

$str = 'first line

second line

last line

';

preg_match_all('/(?m)\b\w+\z/', $str, $arr); // => 0

print_r($arr);

/*

Array

(

[0] => Array

(

)

)

*/

preg_match_all('/(?m)\b\w+\Z/', $str, $arr); // => 1

print_r($arr);

/*

Array

(

[0] => Array

(

[0] => line

)

)

*/

環視

環視(look-around)用來“停在原地,四處張望”,它本身也不匹配任何字符,用來限定它旁邊的文本滿足某種條件。

名字

記法

含義

肯定順序環視

(?=...)

向右看看,右邊出現了環視中的內容才匹配

否定順序環視

(?!...)

向右看看,右邊不出現環視中的內容才匹配

肯定逆序環視

(?<=...)

向左看看,左邊出現了環視中的內容才匹配

否定逆序環視

(?

向左看看,左邊不出現環視中的內容才匹配

例如,要匹配html標簽中的開標簽(、

、等),而不能匹配閉標簽(、、等)和自閉和標簽(
等),同時,也不能匹配一個空的標簽<>。

直接使用將/字符排除是不對的,因為有些標簽的屬性中可能會含有/字符。例如。這里只是在開尖括號之前的第一個字符不能為/。

然而]*[^\/]>也是不行的,因為在之間會至少匹配兩個字符,像這樣的標簽是無法匹配到的。這里就要用到環視了。

上面的正則表達式中有兩個環視結構,一個在開尖括號之前,表示在閉尖括號>之前向左看看,左邊挨著的字符不能為/。

上面的正則表達式已經解決了匹配html中開標簽的主要問題,只是其中的.*?還需要優化一下。需要解決的問題是:

有可能會有單引號'或雙引號",它們都得成對出現

單引號對或雙引號對之內可以有>字符,但是它們的外面不能有>字符

利用正則表達式的選擇結構,可以寫出下面的表達式,用于完善上面的問題。

])+(?

5.匹配模式

前面的內容中已經出現介過了單行模式、多行模式、非貪婪模式。匹配模式是指匹配時使用的規則。常用的匹配模式還有不區分大小寫模式、注釋模式。

在開始介紹具體的模式之前,先介紹php中模式的兩種具體實現/.../{modifier}和...(?{modifier})...:

模式修飾符

/.../{modifier}

...(?{modifier})...

示例

/

.*/s(?s).*

名稱(php手冊)

模式修飾符

模式內修飾符

名稱(《正則指引》)

預定義常量

模式修飾符

作用范圍

整個正則表達式

不在分組(子表達式)中時,對它后面的全部正則表達式起作用;如果在分組(子表達式)中,則對它分組中的剩余部分起作用。在沒有分組,且放在整個正則表達式最前面的時候相當于/.../{modifier}

支持程度

支持所有模式修飾符

支持部分模式修飾符

其他編程語言

可能不支持

一般都支持

不區分大小寫模式

在html中是不區分大小寫的,例如

和、、的作用是一樣的。如果要從網頁中提取,不使用匹配模式的表達式應該是這樣:

由于

標簽只有兩個字符,所以上面的寫法還可以接受。但是如果標簽是world';

preg_match('/

.*<\/tr>/', $str, $arr);

print_r($arr);

/*

Array

(

[0] =>

helloworld

)

*/

// 非貪婪匹配模式

$str = '

helloworld';

preg_match('/

.*<\/tr>/U', $str, $arr);

print_r($arr);

/*

Array

(

[0] =>

hello

)

*/

Unicode

要匹配中文等Unicode字符,最好是指定Unicode模式修飾符/.../u。如果不指定會有兩個問題

GBK編碼環境下,中文不能匹配

無法利用[\x{4e00}-\x{9fff}]匹配中文

// 指定unicode模式

preg_match('/

[\x{4e00}-\x{9fff}]*<\/td>/u', '姚明', $arr);

print_r($arr);

/*

Array

(

[0] =>

姚明

)

*/

總結

以上是生活随笔為你收集整理的正则环视 php,正则表达式基本知识(php)的全部內容,希望文章能夠幫你解決所遇到的問題。

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