ホームページ >バックエンド開発 >PHPチュートリアル >私は正規表現に夢中なのですが、なぜ $matches[0] が空なのでしょうか?
正規表現を書きます。これは通常は一致しますが、一致した文字列全体を返すためにも必要です
正規表現は次のとおりです
preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);
<!-- Layout name="header" --><!-- Layout name="footer" -->
Array( [0] => [1] => header)
ディスカッションに返信(解決策)
preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);
$_content =<<< HTML<!-- Layout name="header" --><!-- Layout name="footer" -->HTML;preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);print_r($matches);は問題ありません
あなたが自分で混乱しているだけです
$matches[0] はテキストモードでのみ表示されるHTMLタグです
Array( [0] => <!-- Layout name="header" --> [1] => header)
$matches[0] には完全なパターンと一致するテキストが含まれます
の後に次の文が続きます: $matches[1] は最初のキャプチャ サブグループと一致するテキストが含まれます、など 意味 のみである必要があります。実行されるグローバル マッチングではなく、アンチキャプチャ (つまり、かっこで囲まれたコンテンツ) を含めるため、グローバル マッチングを実行するには preg_match_all を使用します また、正規表現では先頭に ^ が追加されます。これは、文字列を意味します。 matched は ^ の後のコンテンツで始まる必要があるため、290597e2447b16646905294cfa6c9b84 は一致できません
同様に、$ は、一致する文字列が $ より前で終了する必要があることを意味します。したがって、コンテンツと一致するには、$_content='c2795163a40837317a33c6ab60926b59'; または $_content='cd3d718ee1303fdbc9c6ad796ce58af1';
$_content='<!-- Layout name="header" --><!-- Layout name="footer" -->';preg_match_all('//', $_content, $matches);print_r($matches);/*Array( [0] => Array ( [0] => [1] => ) [1] => Array ( [0] => header [1] => footer ))*/に一致
$_content =<<< HTML<!-- Layout name="header" --><!-- Layout name="footer" -->HTML;preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);print_r($matches);問題ありません
それはあなたが自分で混乱しているだけです
$matches[0] はテキストモードでのみ表示できる HTML タグです
Array( [0] => <!-- Layout name="header" --> [1] => header)
$matches[0] には完全なパターン
に一致するテキストが含まれ、その後に次の文が続きます: $matches[1] には最初にキャプチャしたサブグループに一致するテキストが含まれます など。実行されるグローバル マッチングではなく、アンチキャプチャ (つまり、括弧で囲まれたコンテンツ) のみを含める必要があるため、グローバル マッチングを実行するには preg_match_all を使用します また、正規表現の前に ^ を追加することを意味します。一致する文字列は ^ の後のコンテンツから始まる必要があるため、 は一致できません
同様に、$ は一致する文字列の末尾が $ で始まる必要があることを意味します。コンテンツに一致します。 $_content='290597e2447b16646905294cfa6c9b84'; または $_content=' '; to
文字列があります
$_content='<!-- Layout name="header" --><!-- Layout name="footer" -->';preg_match_all('//', $_content, $matches);print_r($matches);/*Array( [0] => Array ( [0] => [1] => ) [1] => Array ( [0] => header [1] => footer ))*/
$string = 'bbs/csdn/net/xxx';
$string = 'www/csdn/net/xxx';
文字列が始まらないとだけ判断した場合bbs
だと、こっちのほうが早い
^ はマッチングする入力文字列の開始位置で、マッチング対象の文字列が ^ 以降の内容で始まらない場合、マッチングは全く行われません
文字列が bbs で始まっていないと判断されるだけです
、このように比較してください 高速
preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){ //等于0就是以bbs开头,未找到返回false(全等于false) echo 'exe';}