本文目錄一覽:
- 1、php 正則 匹配 括號內數字
- 2、php 正則表達式 匹配數字
- 3、PHP中的正則表達式是什麼意思?
- 4、PHP 正則表達式如何替換URL參數
- 5、php 正則表達式
- 6、php正則表達式的問題
php 正則 匹配 括號內數字
你的已經是寫「對」了的,只不過你沒有提取數字而已。改一下模式:’/\(([\s\S]*?)\)/’,這樣就能利用$matchPlayers[1]得到你要的數字了。在模式中,括號有子模式的作用,也就是從左到右,括號引起的數據從1開始到n,在匹配結果中用下標1到n提取。$matchPlayers[0]則是總結果。詳細參考PHP手冊。
php 正則表達式 匹配數字
沒看懂什麼意思,你給個例子吧,包括原始數據時什麼樣的,最後結果是什麼樣的。我看你的語句,你是想把第一個數字後的所有東西都去掉嗎?
你的正則不對是因為貪婪匹配的原因,第一個(.*)就把所有的東西都匹配了,後面的什麼都沒匹配到。
PHP中的正則表達式是什麼意思?
是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。
給定一個正則表達式和另一個字符串,我們可以達到如下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作「匹配」);
2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。
正則表達式的特點是:
1. 靈活性、邏輯性和功能性非常的強;
2. 可以迅速地用極簡單的方式達到字符串的複雜控制。
3. 對於剛接觸的人來說,比較晦澀難懂。
由於正則表達式主要應用對象是文本,因此它在各種文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內容。
PHP 正則表達式如何替換URL參數
用正則是比較笨的辦法,但也給你提供一下了:
function getpage(){
//你可以把獲取當前page的代碼放在函數里
return 123;
}
$str = ‘index.php?main_page=indexcPath=55pagesize=48’;
$ptn = ‘/pagesize=(\d+)/’;
$pagenum = getpage();
$rep = ‘pagesize=’.$pagenum;
echo $str; // 輸出:index.php?main_page=indexcPath=55pagesize=48
preg_replace($ptn,$rep,$str);
echo $str; // 輸出:index.php?main_page=indexcPath=55pagesize=123
另外多說一下,這種情況可以使用
http_build_query()
這個函數。
具體使用方法:
$u[‘main_page’]=$_GET[‘main_page’];
$u[‘cPath’]=$_GET[‘cPath’];
$u[‘pagesize’]=getpage();
$url = ‘index.php?’.http_build_query($u);
echo $url;
這個函數很好用,比你自己去匹配好。
php 正則表達式
建議你到我的網站上下載PHP5參考手冊,裡邊有詳細的正則表達式的參考。
模式要有開始和結束的字符,一下都是合法的:
/
|
#
‘
前提是模式中不能再出現這個字符了。
結尾的/後邊的is是模式修政府,具體如下
i (PCRE_CASELESS)
如果設定此修正符,模式中的字符將同時匹配大小寫字母。
m(PCRE_MULTILINE)
默認情況下,PCRE 將目標字符串作為單一的一「行」字符所組成的(甚至其中包含有換行符也是如此)。「行起始」元字符(^)僅僅匹配字符串的起始,「行結束」元字符($)僅僅匹配字符串的結束,或者最後一個字符是換行符時其前面(除非設定了 D 修正符)。這和 Perl 是一樣的。
當設定了此修正符,「行起始」和「行結束」除了匹配整個字符串開頭和結束外,還分別匹配其中的換行符的之後和之前。這和 Perl 的 /m 修正符是等效的。如果目標字符串中沒有「\n」字符或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。
s(PCRE_DOTALL)
如果設定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。沒有此設定的話,則不包括換行符。這和 Perl 的 /s 修正符是等效的。排除字符類例如 [^a] 總是匹配換行符的,無論是否設定了此修正符。
x(PCRE_EXTENDED)
如果設定了此修正符,模式中的空白字符除了被轉義的或在字符類中的以外完全被忽略,在未轉義的字符類之外的 # 以及下一個換行符之間的所有字符,包括兩頭,也都被忽略。這和 Perl 的 /x 修正符是等效的,使得可以在複雜的模式中加入注釋。然而注意,這僅適用於數據字符。空白字符可能永遠不會出現於模式中的特殊字符序列,例如引入條件子模式的序列 (?( 中間。
e
如果設定了此修正符,preg_replace() 在替換字符串中對逆向引用作正常的替換,將其作為 PHP 代碼求值,並用其結果來替換所搜索的字符串。
只有 preg_replace() 使用此修正符,其它 PCRE 函數將忽略之。
注意: 本修正符在 PHP3 中不可用。
A(PCRE_ANCHORED)
如果設定了此修正符,模式被強製為「anchored」,即強制僅從目標字符串的開頭開始匹配。此效果也可以通過適當的模式本身來實現(在 Perl 中實現的唯一方法)。
D(PCRE_DOLLAR_ENDONLY)
如果設定了此修正符,模式中的美元元字符僅匹配目標字符串的結尾。沒有此選項時,如果最後一個字符是換行符的話,美元符號也會匹配此字符之前(但不會匹配任何其它換行符之前)。如果設定了 m 修正符則忽略此選項。Perl 中沒有與其等價的修正符。
S
當一個模式將被使用若干次時,為加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字符的 non-anchored 模式有用。
U(PCRE_UNGREEDY)
本修正符反轉了匹配數量的值使其不是默認的重複,而變成在後面跟上「?」才變得重複。這和 Perl 不兼容。也可以通過在模式之中設定 (?U) 修正符或者在數量符之後跟一個問號(如 .*?)來啟用此選項。
X(PCRE_EXTRA)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式中的任何反斜線後面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。默認情況下,和 Perl 一樣,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。當前沒有其它特性受此修正符控制。
u(PCRE_UTF8)
此修正符啟用了一個 PCRE 中與 Perl 不兼容的額外功能。模式字符串被當成 UTF-8。本修正符在 Unix 下自 PHP 4.1.0 起可用,在 win32 下自 PHP 4.2.3 起可用。自 PHP 4.3.5 起開始檢查模式的 UTF-8 合法性。
php正則表達式的問題
很有必要!!
跟我學正則表達式!
想必很多人都對正則表達式都頭疼.今天,我以我的認識,加上網上一些文章,希望用常人都可以理解的表達方式.來和大家分享學習經驗.
開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結束,以下分別舉例說明
“^The”: 開頭一定要有”The”字符串;
“of despair$”: 結尾一定要有”of despair” 的字符串;
那麼,
“^abc$”: 就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配
“notice”: 匹配包含notice的字符串
你可以看見如果你沒有用我們提到的兩個字符(最後一個例子),就是說 模式(正則表達式) 可以出現在被檢驗字符串的任何地方,你沒有把他鎖定到兩邊
接着,說說 ‘*’, ‘+’,和 ‘?’,
他們用來表示一個字符可以出現的次數或者順序. 他們分別表示:
“zero or more”相當於{0,},
“one or more”相當於{1,},
“zero or one.”相當於{0,1}, 這裡是一些例子:
“ab*”: 和ab{0,}同義,匹配以a開頭,後面可以接0個或者N個b組成的字符串(“a”, “ab”, “abbb”, 等);
“ab+”: 和ab{1,}同義,同上條一樣,但最少要有一個b存在 (“ab”, “abbb”, 等.);
“ab?”:和ab{0,1}同義,可以沒有或者只有一個b;
“a?b+$”: 匹配以一個或者0個a再加上一個以上的b結尾的字符串.
要點, ‘*’, ‘+’,和 ‘?’只管它前面那個字符.
你也可以在大括號裏面限制字符出現的個數,比如
“ab{2}”: 要求a後面一定要跟兩個b(一個也不能少)(“abb”);
“ab{2,}”: 要求a後面一定要有兩個或者兩個以上b(如”abb”, “abbbb”, 等.);
“ab{3,5}”: 要求a後面可以有2-5個b(“abbb”, “abbbb”, or “abbbbb”).
現在我們把一定幾個字符放到小括號里,比如:
“a(bc)*”: 匹配 a 後面跟0個或者一個”bc”;
“a(bc){1,5}”: 一個到5個 “bc.”
還有一個字符 ‘│’, 相當於OR 操作:
“hi│hello”: 匹配含有”hi” 或者 “hello” 的 字符串;
“(b│cd)ef”: 匹配含有 “bef” 或者 “cdef”的字符串;
“(a│b)*c”: 匹配含有這樣多個(包括0個)a或b,後面跟一個c
的字符串;
一個點(‘.’)可以代表所有的單一字符,不包括”n”
如果,要匹配包括”n”在內的所有單個字符,怎麼辦?
對了,用'[n.]’這種模式.
“a.[0-9]”: 一個a加一個字符再加一個0到9的數字
“^.{3}$”: 三個任意字符結尾 .
中括號括住的內容只匹配一個單一的字符
“^[a-zA-Z0-9]”@”[a-zA-Z0-9]”.”[a-zA-Z]$”
“[ab]”: 匹配單個的 a 或者 b ( 和 “a│b” 一樣);
“[a-d]”: 匹配’a’ 到’d’的單個字符 (和”a│b│c│d” 還有 “[abcd]”效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文
“^[a-zA-Z]”: 匹配以大小寫字母開頭的字符串
“[0-9]%”: 匹配含有 形如 x% 的字符串
“,[a-zA-Z0-9]$”: 匹配以逗號再加一個數字或字母結尾的字符串
你也可以把你不想要得字符列在中括號里,你只需要在總括號裏面使用’^’ 作為開頭 “%[^a-zA-Z]%” 匹配含有兩個百分號裏面有一個非字母的字符串.
要點:^用在中括號開頭的時候,就表示排除括號里的字符
為了PHP能夠解釋,你必須在這些字符面前後加”,並且將一些字符轉義.
不要忘記在中括號裏面的字符是這條規路的例外—在中括號裏面, 所有的特殊字符,包括(”), 都將失去他們的特殊性質 “[*+?{}.]”匹配含有這些字符的字符串.
還有,正如regx的手冊告訴我們: “如果列表裡含有 ‘]’, 最好把它作為列表裡的第一個字符(可能跟在’^’後面). 如果含有’-‘, 最好把它放在最前面或者最後面, or 或者一個範圍的第二個結束點[a-d-0-9]中間的『-』將有效.
看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小於m. 這樣,才能 最少匹配n次且最多匹配m次. 如”p{1,5}”將匹配 “pvpppppp”中的前五個p
下面說說以開頭的
b 書上說他是用來匹配一個單詞邊界,就是…比如’veb’,可以匹配love里的ve而不匹配very里有ve
B 正好和上面的b相反.例子我就不舉了
好,我們來做個應用:
如何構建一個模式來匹配 貨幣數量 的輸入
構建一個匹配模式去檢查輸入的信息是否為一個表示money的數字。我們認為一個表示money的數量有四種方式: “10000.00” 和 “10,000.00”,或者沒有小數部分, “10000” and “10,000”. 現在讓我們開始構建這個匹配模式:
^[1-9][0-9]*$
這是所變量必須以非0的數字開頭.但這也意味着 單一的 “0” 也不能通過測試. 以下是解決的方法:
^(0│[1-9][0-9]*)$
“只有0和不以0開頭的數字與之匹配”,我們也可以允許一個負號在數字之前:
^(0│-?[1-9][0-9]*)$
這就是: “0 或者 一個以0開頭 且可能 有一個負號在前面的數字.” 好了,現在讓我們別那麼嚴謹,允許以0開頭.現在讓我們放棄 負號 , 因為我們在表示錢幣的時候並不需要用到. 我們現在指定 模式 用來匹配小數部分:
^[0-9]+(.[0-9]+)?$
這暗示匹配的字符串必須最少以一個阿拉伯數字開頭. 但是注意,在上面模式中 “10.” 是不匹配的, 只有 “10” 和 “10.2” 才可以. (你知道為什麼嗎)
^[0-9]+(.[0-9]{2})?$
我們上面指定小數點後面必須有兩位小數.如果你認為這樣太苛刻,你可以改成:
^[0-9]+(.[0-9]{1,2})?$
這將允許小數點後面有一到兩個字符. 現在我們加上用來增加可讀性的逗號(每隔三位), 我們可以這樣表示:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
不要忘記 ‘+’ 可以被 ‘*’ 替代 如果你想允許空白字符串被輸入話 (為什麼?). 也不要忘記反斜桿 』』 在php字符串中可能會出現錯誤 (很普遍的錯誤).
現在,我們已經可以確認字符串了, 我們現在把所有逗號都去掉 str_replace(“,”, “”, $money) 然後在把類型看成 double然後我們就可以通過他做數學計算了.
再來一個:
構造檢查email的正則表達式
在一個完整的email地址中有三個部分:
1. 用戶名 (在 ‘@’ 左邊的一切),
2.’@’,
3. 服務器名(就是剩下那部分).
用戶名可以含有大小寫字母阿拉伯數字,句號 (‘.’), 減號(‘-‘), and 下劃線 (‘_’). 服務器名字也是符合這個規則,當然下劃線除外.
現在, 用戶名的開始和結束都不能是句點. 服務器也是這樣. 還有你不能有兩個連續的句點他們之間至少存在一個字符,好現在我們來看一下怎麼為用戶名寫一個匹配模式:
^[_a-zA-Z0-9-]+$
現在還不能允許句號的存在. 我們把它加上:
^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*$
上面的意思就是說: “以至少一個規範字符(除了.)開頭,後面跟着0個或者多個以點開始的字符串.”
簡單化一點, 我們可以用 eregi()取代 ereg().eregi()對大小寫不敏感, 我們就不需要指定兩個範圍 “a-z” 和 “A-Z” – 只需要指定一個就可以了:
^[_a-z0-9-]+(.[_a-z0-9-]+)*$
後面的服務器名字也是一樣,但要去掉下劃線:
^[a-z0-9-]+(.[a-z0-9-]+)*$
好. 現在只需要用」@」把兩部分連接:
^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$
這就是完整的email認證匹配模式了,只需要調用
eregi(『^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$ 』,$email)
就可以得到是否為email了
正則表達式的其他用法
提取字符串
ereg() and eregi() 有一個特性是允許用戶通過正則表達式去提取字符串的一部分(具體用法你可以閱讀手冊). 比如說,我們想從 path/URL 提取文件名 – 下面的代碼就是你需要:
ereg(“([^/]*)$”, $pathOrUrl, $regs);
echo $regs[1];
高級的代換
ereg_replace() 和 eregi_replace()也是非常有用的: 假如我們想把所有的間隔負號都替換成逗號:
ereg_replace(“[ nrt]+”, “,”, trim($str));
最後,我把另一串檢查EMAIL的正則表達式讓看文章的你來分析一下.
“^[-!#$%’*+./0-9=?A-Z^_`a-z{|}~]+’.’@’.'[-!#$%’*+/0-9=?A-Z^_`a-z{|}~]+.’.'[-!#$%’*+./0-9=?A-Z^_`a-z{|}~]+$”
如果能方便的讀懂,那這篇文章的目的就達到了.
這篇文章我是在網上找到的…關於正則表達式我也只看過這篇文章…覺得還行看完以後簡單的正則表達式還是能看懂的。
原創文章,作者:GXGQN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/330139.html