正則表達式--函數 學習筆記

①PHP中可使用ereg()函數進行模式匹配操做。ereg()函數的使用格式以下:
  php

如下爲引用的內容:
  ereg(pattern, string)

  其中,pattern表明正則表達式的模式,而string則是執行查找替換操做的目標對象。一樣是驗證郵件地址,使用PHP編寫的程序代碼以下:html

< ?php
   if (ereg(「^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+」,$email)){
              echo 「Your email address is correct!」;}
   else{
              echo 「Please try again!」;
      }
?>正則表達式


②JavaScript 1.2中帶有一個功能強大的RegExp()對象,能夠用來進行正則表達式的匹配操做。其中的test()方法能夠檢驗目標對象中是否包含匹配模式,並相應的返回true或false。服務器

咱們可使用JavaScript編寫如下腳本,驗證用戶輸入的郵件地址的有效性。函數

 

如下爲引用的內容:
 <html>
   <head>
    <script language=\"Javascript1.2\">
     <!-- start hiding
     function verifyAddress(obj)
     {
      var email = obj.email.value;
      var pattern = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
      flag = pattern.test(email);
      if(flag)
      {
       alert(「Your email address is correct!」);
       return true;
      }
      else
       {
        alert(「Please try again!」);
        return false;
        }
      }
     // stop hiding -->
    </script>
   </head>
   <body>
   <form onSubmit=\"return verifyAddress(this);\">
   <input name=\"email\" type=\"text\"/>
   <input type=\"submit\"/>
   </form>
  </body>
 </html>


想必不少人都對正則表達式都頭疼。今天,我以個人認識,加上網上一些文章,但願用常人均可以理解的表達方式。來和你們分享學習經驗。學習

開篇,仍是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結束,如下分別舉例說明:測試

「^The」:開頭必定要有」The」字符串;
「of despair$」:結尾必定要有」of despair」 的字符串;this

那麼,
「^abc$」:就是要求以abc開頭和以abc結尾的字符串,其實是隻有abc匹配;
「notice」:匹配包含notice的字符串;spa

你能夠看見若是你沒有用咱們提到的兩個字符(最後一個例子),就是說模式(正則表達式)能夠出如今被檢驗字符串的任何地方,你沒有把他鎖定到兩邊。.net

接着,說說 ‘*’ ‘+’ 和 ‘?’
他們用來表示一個字符能夠出現的次數或者順序,他們分別表示:
「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}$」: 三個任意字符結尾。

中括號括住的內容只匹配一個單一的字符

「[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 書上說他是用來匹配一個單詞邊界,就是…好比’ve\b’,能夠匹配love裏的ve而不匹配very裏有ve

\B 正好和上面的\b相反。例子我就不舉了

…..忽然想起來….能夠到 http://www.phpv.net/article.php/251 看看其它用\開頭的語法

好,咱們來作個應用:如何構建一個模式來匹配貨幣數量的輸入。

構建一個匹配模式去檢查輸入的信息是否爲一個表示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-]+)*$」,$eamil)

就能夠獲得是否爲email了

正則表達式的其餘用法

提取字符串

ereg() and eregi() 有一個特性是容許用戶經過正則表達式去提取字符串的一部分(具體用法你能夠閱讀手冊)。好比說,咱們想從 path/URL 提取文件名,下面的代碼就是你須要:

ereg(」([^\\/]*)$」, $pathOrUrl, $regs);
echo $regs[1];

高級的代換

ereg_replace() 和 eregi_replace()也是很是有用的,假如咱們想把全部的間隔負號都替換成逗號:

ereg_replace(」[ \n\r\t]+」, 「,」, trim($str));

最後,我把另外一串檢查EMAIL的正則表達式讓看文章的你來分析一下:

「^[-!#$%&\’*+\\./0-9=?A-Z^_`a-z{|}~]+’.’@’.’[-!#$%&\’*+\\/0-9=?A-Z^_`a-z{|}~]+\.’.’[-!#$%&\’*+\\./0-9=?A-Z^_`a-z{|}~]+$」

若是能方便的讀懂,那這篇文章的目的就達到了。

相關文章
相關標籤/搜索