php 正則表達式(Regular Expression)用法

文章收藏了關于php 正則表達式用法與常用的正則表達式規則與實例,有需要的同學可以參考一下本文章。

正則表達式(Regular Expression)

正則表達式系統:

  1.POSIX

  2.Perl

PHP中使用的regex是PCRE:

  NOTE:PCRE(Perl兼容正則表達式,Perl Compatible Regular Expressions)

PCRE語法:

  1.定界符

    必須成對出現,可以使用除0-9a-zA-Z以外的任何字符

  2.原子

    1.正則需要匹配的可見和不可見字符都是原子

    2.一個正則表達式最少含有一個原子

    3.當需要匹配諸如"("、"["、"^"等含有語義的符號時需要用""反斜線進行轉義

    原子字符:

      f 匹配換頁符

      n 匹配換行符

      r 匹配回車符

      t 匹配制表符

      v 匹配垂直制表符

  3.元字符

     轉義字符

    ^ 匹配字符串起始處

    $ 匹配字符串末尾

    . 匹配除"n"之外的任何單個字符

    * 匹配前面的子表達式0或多次

    + 匹配前面的子表達式1次或多次

    ? 匹配前面的子表達式0次或1次

    {n} 匹配n次

    {n,} 匹配n次或n次以上

    {n,m} 最少匹配n次至多匹配m次,(n<=m)

    [] 中括號代表原子表,中間的原子地位都是相等。在匹配的時候,匹配表中的任意一個字符

    [^] 抑揚符,排除後面的原子表所包含的字符。

    (pattern) 匹配pattern並獲取這一匹配。

    num 對獲取的第num個匹配的引用。


    (?:pattern) 匹配pattern但不獲取這一匹配

    (?=pattern) 正向肯定預查,非獲取匹配,例如:windows(?=XP|7)能匹配windowsXP中的windows不能匹配windows98中的windows

    (?!=pattern) 正向否定欲查非獲取匹配,例如:windows(?!98|2000),能匹配windowsXP中的windows,不能匹配windows98中的windows

    (?<=pattern) 反向肯定預查,非獲取匹配。例如:(?<=My|Postgre)SQL能匹配MySQL中的SQL,不能匹配MSSQL中的SQL

    (?<!pattern) 反向否定預查,非獲取匹配。例如:(?<!My|Postgre)SQL能匹配MSSQL中的SQL,不能匹配MySQL中的SQL

    b 匹配單詞邊界

    B 匹配除單詞邊界以外的字符

    

    d 匹配任何一個數字。等價于[0-9]

    D 匹配任何一個非數字以外的字符。等價于[^0-9]

    s 匹配任何一個空白字符(包括空格、制表符、換頁符等)。等價于[fnrtv]

    S 匹配任何一個非空白字符。等價于[^fnrtv]

    

    w 匹配任何一個數字、字母或下劃線。等價于[0-9a-zA-Z]

    W 匹配任何一個非數字、字母或下劃線的字符。等價于[^0-9a-zA-Z]

4.模式修正符

  i 不區分大小寫

  m 此模式中如果有回車或換行,^和$將匹配每行的行首和行尾

  s 讓.能匹配n

  x 忽略空白

  U 取消貪婪,相當于(.*?)

  A 與^效果一樣

  D 結尾處不忽略回車 ,在結束處有$符的時候,在匹配的字符串後面加上回車,$依然能夠匹配它成功。但是加上D之後,結尾的回車,不再匹配

  NOTE:正則表達式是從左向右進行匹配的

 常用的正則表達式
1、非負整數:”^d+$”

2、正整數:”^[0-9]*[1-9][0-9]*$”

3、非正整數:”^((-d+)|(0+))$”

4、負整數:”^-[0-9]*[1-9][0-9]*$”

5、整數:”^-?d+$”

6、非負浮點數:”^d+(.d+)?$”

7、正浮點數:”^((0-9)+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$”

8、非正浮點數:”^((-d+.d+)?)|(0+(.0+)?))$”

9、負浮點數:”^(-((正浮點數正則式)))$”

10、英文字符串:”^[A-Za-z]+$”

11、英文大寫串:”^[A-Z]+$”

12、英文小寫串:”^[a-z]+$”

13、英文字符數字串:”^[A-Za-z0-9]+$”

14、英數字加下劃線串:”^w+$”

15、E-mail地址:”^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$”

16、URL:”^[a-zA-Z]+://(w+(-w+)*)(.(w+(-w+)*))*(?s*)?$”


下面這個用PHP寫的函數,可以獲取任意的字符串$string中的所有鏈接地址($string可以是從一個HTML頁面文件直接讀取出來的字符串),結果保存在一個數組中返回.該函數自動把電子郵件地址排除在外,而且返回的數組中不會有重複元素.

代碼如下

function GetAllLink($string)
{
$string = str_replace("r","",$string);
$string = str_replace("n","",$string);

$regex[url] = "((http|https|ftp|telnet|news)://)?([a-z0-9_-/.]+.[][a-z0-9:;&#@=_~%?/.,+-]+)";
$regex[email] = "([a-z0-9_-]+)@([a-z0-9_-]+.[a-z0-9-._-]+)";

//去掉標簽之間的文字
$string = eregi_replace(">[^<>]+<","><", $string);

//去掉JAVASCRIPT代碼
$string = eregi_replace("<!--.*//-->","", $string);

//去掉非<a>的HTML標簽

代碼如下

$string = eregi_replace("<[^a][^<>]*>","", $string);

//去掉EMAIL鏈接
$string = eregi_replace("<a([ ]+)href=(["']*)mailto:($regex[email])(["']*)[^>]*>","", $string);

//替換需要的網頁鏈接
$string = eregi_replace("<a([ ]+)href=(["']*)($regex[url])(["']*)[^>]*>","\3t", $string);

$output[0] = strtok($string, "t");
while(($temp = strtok("t")))
{
if($temp && !in_array($temp, $output))
$output[++$i] = $temp;
}

return $output;
}


以下是以PHP的語法所寫的示例
驗證字符串是否只含數字與英文,字符串長度並在4~16個字符之間

代碼如下

<?php
$str = 'a1234';
if (preg_match("^[a-zA-Z0-9]{4,16}$", $str)) {
echo "驗證成功";} else {
echo "驗證失??quot;;}?>

簡易的台灣身分證字號驗證

代碼如下

<?php
$str = 'a1234';
if (preg_match("^(?:d{15}|d{18})$", $str)) {
echo "驗證成功";
} else {
echo "驗證失??quot;;}
?>


下面的代碼實現文字中的代碼塊,功能就如你在腳本之家看到的代碼一樣。

代碼如下

function codedisp($code) {
global $discuzcodes;
$discuzcodes['pcodecount']++;
$code = htmlspecialchars(str_replace('\"', '"', preg_replace("/^[nr]*(.+?)[nr]*$/is", "\1", $code)));
$discuzcodes['codehtml'][$discuzcodes['pcodecount']] = "<br><div class="msgheader"><div class="right"><a href="###" class="smalltxt" onclick="copycode($('phpcode$discuzcodes[codecount]'));">[複制此代碼]</a></div>代碼如下:</div><div class="msgborder" id="phpcode$discuzcodes[codecount]">".fhtml2($code)."</div><br>";
$discuzcodes['codecount']++;
return "[tDISCUZ_CODE_$discuzcodes[pcodecount]t]";
}
$message = preg_replace("/s*[code](.+?)[/code]s*/ies", "codedisp('\1')", $message);
$message = preg_replace("/s*[html](.+?)[/html]s*/ies", "htmldisp('\1')", $message);

更多相關文章
  • 可能很多朋友在使用replace時只是簡單的替換字符了,replace不但可以替換字符還可以直接在裏面使用正則表達式來替換了,下面我們一起來看看具體一些關于replace正則替換字符的用法吧.mysql字段值替換具體做法如下: 代碼如下 update `table_hospital` set ser
  • php教程的正則表達式完全手冊前言 正則表達式是煩瑣的,但是強大的,學會之後的應用會讓你除了提高效率外,會給你帶來絕對的成就感.只要認真去閱讀這些資料,加上應用的時候進行一定的參考,掌握正則表達式不是問題.索引 1.
  • java 正則表達式之pattern類 matcher類
    本文章分享了關于java 正則表達式之pattern類 matcher類入門教程,有需要學
  • t-sql 正則表達式創建程序集 clrregexclass.cs,並使用 c:windowsmicrosoft.netframeworkv2.0.50727csc.exe /target:library clrre
  • Dreamweaver中使用正則表達式替換href中的內容
    可能在dw中使用正則表達式替換字符串的朋友很少,下面我來給大家介紹Dreamweaver中使用正則表達式替換href中的內容吧. 在Dreamweaver中使用正則表達式替換href中的內容,就像下面這些href中的內容複雜多樣的情況下,href="/html/u.html",h ...
  • 直接量語法/pattern/attributes創建 regexp 對象的語法: 代碼如下:var obj=new regexp(pattern,attributes);事例1: 代碼如下:var pattern=/
  • 下面給各位同學整理了一些關于php array數組的相關處理函數and str字符串處理與正則表達式,希望文章對你會有所幫助.數組的相關處理函數:1)數組的鍵值操作函數 array_values();//獲取數組中的值array_keys();//獲取數組中的鍵in_array();//檢查一個值是
  • 本文章來給大家介紹php 正則表達式 匹配以"XXX"開頭不能以"YYY"結尾,下面的實例我們以abc開頭與 首先來是abc開頭, 沒有想的就是 ^abc 以abc開頭了,不能以"xyz"結尾後面要有一串的字符串一般
一周排行
  • git 獲取曆史版本的方法介紹
    本文章來爲各位介紹一篇關于git 獲取曆史版本的方法介紹,希望這個例子能夠爲各位同學帶來一
  • LOAD DATA INFILE語句從一個文本文件中以很高的速度讀入一個表中.如果指定LOCAL關鍵詞,從客戶主機讀文件.如果LOCAL沒指定,文件必須位于伺服器上LOAD DATA INFILE 'E://temp
  • Python/PHP數字螺旋矩陣的程序代碼
    矩陣不管在php或python中它只是一種算法了,我們要做的就是利用我們所學的程序來實現這
  • asp.net EntityFramework 6連接Sqlite數據庫例子
    下面我們一起來看一個asp.net EntityFramework 6連接Sqlite數據
  • 本文章來給大家介紹asp.net中CSharpThinking 擴展方法 ,有需要了解的朋友可進入參考.本章主要描述擴展方法的應用及相關原理.一, 演變 1.1 擴展方法特征 1)必須在一個靜態方法中. 2)至少有一
  • 在ubuntu安裝php nginx mysql mongodb redis的方法幾乎都是一樣因爲這個就像安裝軟件一樣了,我們今天來爲各位介紹一下它們的安裝過程,希望下文能夠爲各位帶來幫助.ubuntu apt-ge
  • C中一些常用的字符串hash函數 有需要了解的朋友可參考一下. 代碼如下 //SDBM Hash Functionunsigned int SDBMHash(char *str) { unsigned int has
  • 下面來看看關于NetBeans無法使用編碼GBK安全地打開該文件問題的解決辦法吧,希望例子可幫助到各位.應該有不少朋友在使用NetBeans打開包含路徑裏面的UTF-8編碼的文件時,明明自己已經設置了專案編碼爲UTF ...
  • 基于jquery popup彈出層代碼
    這是利用了jquery的一些功能來簡單的實現了漂亮的popup彈出層效果,有需要的朋友可以 ...
  • 在使用xml-rpc的時候,server端獲取client數據,主要是通過php輸入流input,而不是$_POST數組.所以,這裏主要探討php輸入流php://input.下面的例子摘取的是wordpress中的 ...