<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                我們通過元字符和原子完成了正則表達式的入門。但有一些特殊情況我們依然需要來處理。 如果abc在第二行的開始處如何匹配? 我不希望正則表達示特別貪婪的匹配全部,只匹配一部分怎么辦? 這個時候,我們就需要用到下面的這些模式匹配來增強正則的功能。 常用的模式匹配符有: | 模式匹配符 | 功能 | | -- | -- | | i | 模式中的字符將同時匹配大小寫字母. | | m | 字符串視為多行 | | s | 將字符串視為單行,換行符作為普通字符. | | x | 將模式中的空白忽略. | | A | 強制僅從目標字符串的開頭開始匹配. | | D | 模式中的美元元字符僅匹配目標字符串的結尾. | | U | 匹配最近的字符串. | 模式匹配符的用法如下: > / 正則表達示/模式匹配符 模式匹配符是放在這句話的最后的。例如: > /\w+/s 格式我們清楚了,接下來最主要的是加強對于模式匹配符使用的理解和記憶。我們通過代碼來理解加上和不加模式匹配符有何區別。 ###i 不區分大小寫 ~~~ <?php //在后面加上了一個i $pattern = '/ABC/i'; $string = '8988abc12313'; $string1 = '11111ABC2222'; if(preg_match($pattern, $string, $matches)){ echo '匹配到了,結果為:'; var_dump($matches); }else{ echo '沒有匹配到'; } ?> ~~~ 結論,不論是$string還是$string1全都匹配成功了。因此,在后面加上了i之后,在匹配的時候可以不區分大小寫。 ### m 視為多行 正則在匹配的時候,要匹配的目標字符串我們通常視為一行。 “行起始”元字符(^)僅僅匹配字符串的起始,“行結束”元字符($)僅僅匹配字符串的結束。 當設定了此修正符,“行起始”和“行結束”除了匹配整個字符串開頭和結束外,還分別匹配其中的換行符的之后和之前。 **注意:如果要匹配的字符串中沒有“\n”字符或者模式中沒有 ^ 或 $,則設定此修正符沒有任何效果。** 我們通過實驗和代碼來驗證一下這個特點: 第一次匹配,你會發現匹配不成功: ~~~ <?php $pattern = '/^a\d+/'; $string = "我的未來在自己手中我需要不斷的努力 a9是一個不錯的字符表示 怎么辦呢,其實需要不斷奮進"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ~~~ 第二次匹配,我們加上m 試試: ~~~ <?php $pattern = '/^a\d+/m'; $string = "我的未來在自己手中我需要不斷的努力 a9是一個不錯的字符表示 怎么辦呢,其實需要不斷奮進"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ~~~ 結果: 哦耶!匹配成功了。/^a\d+/ 匹配的內容是a9,必須得在行開始處。在第二行也被匹配成功了。 ![document/2015-09-04/55e9579575df0](http://box.kancloud.cn/document_2015-09-04_55e9579575df0.png) ###s 視為一行 如果設定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。 第一次,不加模式匹配符s: ~~~ <?php $pattern = '/新的未來.+\d+/'; $string = '新的未來 987654321'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?> ~~~ 第二次,在正則表達示后面加上模式匹配符s: ~~~ <?php $pattern = '/新的未來.+\d+/s'; $string = "新的未來 987654321"; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?> ~~~ 結果如下,匹配成功! ![document/2015-09-04/55e9622e85495](http://box.kancloud.cn/document_2015-09-04_55e9622e85495.png) **結論:** 1. 因為在新的未來,未來后面有一個換行 2. 而.(點)是匹配非空白字符以外的所有字符。因此,第一次不成功 3. 第二次,加上了s模式匹配符。因為,加上后.(點)能匹配所有字符。 ###x 忽略空白字符 1. 如果設定了此修正符,模式中的空白字符除了被轉義的或在字符類中的以外完全被忽略。 2. 未轉義的字符類外部的#字符和下一個換行符之間的字符也被忽略。 我們先來實驗一下忽略空白行等特性: ~~~ <?php $pattern = '/a b c /x'; $string = '學英語要從abc開始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?> ~~~ 這樣也能匹配成功。 ![document/2015-09-04/55e9644052bd6](http://box.kancloud.cn/document_2015-09-04_55e9644052bd6.png) 在$pattern里面有空格,每個abc后面有一個空格。而$string里面沒有空格。 所以x忽略空白字符。 而第二句話從字面上比較難理解, ~~~ <?php //重點觀察這一行 $pattern = '/a b c #我來寫一個注釋 /x'; $string = '學英語要從abc開始'; if (preg_match($pattern, $string, $matches)) { echo '匹配到了,結果為:'; var_dump($matches); } else { echo '沒有匹配到'; } ?> ~~~ 結果也匹配成功了! ![document/2015-09-04/55e9644052bd6](http://box.kancloud.cn/document_2015-09-04_55e9644052bd6.png) 我們發現,x的第二個特性是忽略:#字符和下一個換行符之間的字符也被忽略。 ###e 將匹配項找出來,進行替換 * e模式也叫逆向引用。主要的功能是將正則表達式括號里的內容取出來,放到替換項里面替換原字符串。 * 使用這個模式匹配符前必須要使用到preg_replace()。 > mixed preg_replace ( mixed $正則匹配項 , mixed $替換項 , mixed $查找字符串) * preg_replace的功能:使用$正則匹配項變,找到$查找字符串變量。然后用$替換項變量進行替換。 在正式講解前我們回顧一下之前的知識,我們故意把每個要匹配的原子外面都加上括號: ~~~ <?php //加上了括號 $pattern = '/(\d+)([a-z]+)(\d+)/'; $string = '987abc321'; if (preg_match($pattern, $string, $match)) { echo '匹配到了,結果為:'; var_dump($match); } else { echo '沒有匹配到'; } ?> ~~~ 我們來看看結果: ![document/2015-09-05/55ea63c27b9e2](http://box.kancloud.cn/document_2015-09-05_55ea63c27b9e2.png) 這是我們之前講括號的時候:匹配到的內容外面有括號。會把括號里面的內容,也放到數組的元素里面。如圖中的:987、abc、321。 我們接下來看正則表達示中的e模式: ~~~ <?php $string = "{April 15, 2003}"; //'w'匹配字母,數字和下劃線,'d'匹配0-99數字,'+'元字符規定其前導字符必須在目標對象中連續出現一次或多次 $pattern = "/{(\w+) (\d+), (\d+)}/i"; $replacement = "\$2"; //字符串被替換為與第 n 個被捕獲的括號內的子模式所匹配的文本 echo preg_replace($pattern, $replacement, $string); ?> ~~~ 我們看看執行結果: ![document/2015-09-05/55ea647e995b4](http://box.kancloud.cn/document_2015-09-05_55ea647e995b4.png) 結論: 1. 上例中\$2 指向的是正則表達示的第一個(\d+)。相當于把15又取出來了 2. 替換的時候,我寫上\$2。將匹配項取出來,用來再次替換匹配的結果。 ###U 貪婪模式控制 正則表達式默認是貪婪的,也就是盡可能的最大限度匹配。 我們來看看正則表達示是如何貪婪的: ~~~ <?php $pattern = '/<div>.*<\/div>/'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,結果為:'; var_dump($match); } else { echo '沒有匹配到'; } ?> ~~~ 我們來看看結果,得到如下結論。它從“<div>你好”直接匹配到了“我是</div>”。進行了最大范圍的匹配。 ![document/2015-09-05/55ea7253227a5](http://box.kancloud.cn/document_2015-09-05_55ea7253227a5.png) 同樣一段代碼我們再加大寫的U,再看看效果: ~~~ <?php $pattern = '/<div>.*<\/div>/U'; $string = "<div>你好</div><div>我是</div>"; if (preg_match($pattern, $string, $match)) { echo '匹配到了,結果為:'; var_dump($match); } else { echo '沒有匹配到'; } ?> ~~~ ![document/2015-09-05/55ea72bc445e6](http://box.kancloud.cn/document_2015-09-05_55ea72bc445e6.png) 我們發現,只匹配出來了: ~~~ <div>你好</div> ~~~ 這樣,把正則的貪婪特性取消掉。讓它找到了最近的匹配,就OK了。 ###A 從目標字符串的開頭開始匹配 此模式類似于元字符中的^(抑揚符)效果。 ~~~ <?php $pattern = '/this/A'; $string = 'hello this is a '; //$string1 = 'this is a '; if (preg_match($pattern, $string, $match)) { echo '匹配到了,結果為:'; var_dump($match); } else { echo '沒有匹配到'; } ?> ~~~ 結論: 1. 如果加A模式修正符的時候匹配不出來$string,不加時能匹配出來 2. 如果加上了A模式修正符的時候能匹配出來$string1,因為必須要從開始處開始匹配 ### D 結束$符后不準有回車 如果設定了此修正符,模式中的美元元字符僅匹配目標字符串的結尾。沒有此選項時,如果最后一個字符是換行符的話,美元符號也會匹配此字符之前。 ~~~ <?php $pattern = '/\w+this$/'; //$pattern1 = '/\w+this$/D'; $string = "hellothis "; if (preg_match($pattern, $string, $match)) { echo '匹配到了,結果為:'; var_dump($match); } else { echo '沒有匹配到'; } ?> ~~~ 結果展示: ![document/2015-09-05/55ea790f3df3f](http://box.kancloud.cn/document_2015-09-05_55ea790f3df3f.png) 結論: 1. 如pattern 在匹配$string的時候,$string的字符串this后有一個回車。在沒有加D匹配符的時候也能匹配成功 2. 如pattern 在匹配$string的時候,加上了D。$string的字符串this后有空格,匹配不成功。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看