寫個正則,能正常匹配到,但我還需要他返回匹配的整條字串
正則如下
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';}