被正則玩瘋了,為什麼$matches[0]為空白?

來源:互聯網
上載者:User
寫個正則,能正常匹配到,但我還需要他返回匹配的整條字串

正則如下
preg_match( '/^/', $_content, $matches);


$_content的內容是
 


我知道只能匹配到第一條,但根據官方文檔寫的: $matches[0]將包含完整模式比對到的文本
但我測試了很久,只能得到以下結果
Array(    [0] =>     [1] => header)

$matches[0]為什麼會為空白?說好的匹配到的文本呢?(我原意是想$matches[0]值為 的)

還有一個問題,不知道為什麼斷言後就匹配不到,
preg_match( '/^$/', $_content, $matches);

就這樣,末尾加了個美元符,就匹配不到任何東西了,雖然這個不影響,但我還是想知道是為什麼,看網上的文檔,一堆 術語頭都暈了,希望高人解答,謝謝。

暈,怎麼只能給100分啊,我有1000分的。。。


回複討論(解決方案)

$_content =<<< HTMLHTML;preg_match( '/^/', $_content, $matches);print_r($matches);
Array(    [0] =>     [1] => header)
沒有問題

只不過你是被你自己弄糊塗了
$matches[0] 是一個html標記,只在文本方式下才能看到

$_content='';preg_match_all('//', $_content, $matches);print_r($matches);/*Array(    [0] => Array        (            [0] =>             [1] =>         )    [1] => Array        (            [0] => header            [1] => footer        ))*/

$matches[0]將包含完整模式比對到的文本,它後面還有一句: $matches[1]將包含第一個捕獲子組匹配到的文本, 以此類推.
意思應該是只包含你反捕獲(也就是你的小括弧括起來的內容),而不是執行的全域匹配,所以用preg_match_all來執行全域匹配
還有你的正則在最前面加了^,它表示你執行匹配的字串必須已^之後的內容開始,所以是不能匹配到了
同理,$表示匹配的字串必須以$之前的結尾,所以要匹配到內容,$_content='';或者$_content='‘;才能被匹配到

$_content =<<< HTMLHTML;preg_match( '/^/', $_content, $matches);print_r($matches);
Array(    [0] =>     [1] => header)
沒有問題

只不過你是被你自己弄糊塗了
$matches[0] 是一個html標記,只在文本方式下才能看到



我了個去!!!忘記了HTML的注釋標記,暈,真的昏了一晚上啊,感謝提醒。

$_content='';preg_match_all('//', $_content, $matches);print_r($matches);/*Array(    [0] => Array        (            [0] =>             [1] =>         )    [1] => Array        (            [0] => header            [1] => footer        ))*/

$matches[0]將包含完整模式比對到的文本,它後面還有一句: $matches[1]將包含第一個捕獲子組匹配到的文本, 以此類推.
意思應該是只包含你反捕獲(也就是你的小括弧括起來的內容),而不是執行的全域匹配,所以用preg_match_all來執行全域匹配
還有你的正則在最前面加了^,它表示你執行匹配的字串必須已^之後的內容開始,所以是不能匹配到了
同理,$表示匹配的字串必須以$之前的結尾,所以要匹配到內容,$_content='';或者$_content='‘;才能被匹配到



還是不太懂,是不是用了 ^ 之後,只能從 $content[0] 開始比較?前面的字串相同就進行匹配, $ 同理?

還有一個問題希望能解決一下

存在一字串

$string = 'bbs/csdn/net/xxx';


如果字串不是以bbs開頭的就進行匹配
比如
$string = 'www/csdn/net/xxx';

因為不以 bbs 開頭,繼續匹配

我想到一種寫法
preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);

但感覺這個效率有點低下,不知道還能不能最佳化一下?

^是匹配輸入字串的開始位置,若待匹配的字串不是以^之後的內容開始,根本就不會執行匹配

若是只是判斷 字串不是以bbs開頭,這樣比較快

$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){//等於0就是以bbs開頭,未找到返回false(全等於false)echo 'exe';}

^是匹配輸入字串的開始位置,若待匹配的字串不是以^之後的內容開始,根本就不會執行匹配

若是只是判斷 字串不是以bbs開頭,這樣比較快

$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){//等於0就是以bbs開頭,未找到返回false(全等於false)echo 'exe';}



不是,其實我想寫個類似django這樣的URL路由功能,如果按上面的方法的話,擴充性不夠強,所以想用正則表達

$str='www/bbs/net/xxx/';if(preg_match('/^bbs.+?/', $str)){echo '以bbs開頭';}else{echo 'exe';}
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.