ホームページ > バックエンド開発 > PHPチュートリアル > 私は正規表現に夢中なのですが、なぜ $matches[0] が空なのでしょうか?

私は正規表現に夢中なのですが、なぜ $matches[0] が空なのでしょうか?

WBOY
リリース: 2016-06-13 12:07:50
オリジナル
839 人が閲覧しました

私は正規表現に夢中なのですが、なぜ $matches[0] が空なのでしょうか?
正規表現を書きます。通常は一致しますが、一致する文字列全体を返すためにも必要です

正規表現は次のとおりです

<br />preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);<br />
ログイン後にコピー


の内容$_content は
<br /><!-- Layout name="header" --><br /><!-- Layout name="footer" -->
ログイン後にコピー


最初のもののみと一致することはわかっていますが、公式ドキュメントによると、$matches[0] には完全なパターンと一致するテキストが含まれます
しかし、長い間テストしてきましたが、次の結果しか得られません
Array<br />(<br />    [0] => <br />    [1] => header<br />)
ログイン後にコピー

$matches[0] が空なのはなぜですか?一致したテキストはどうなるでしょうか? (私の当初の意図は、$matches[0] の値が であることです。)

なぜそうなるのかはわかりません。
<br />preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->$/', $_content, $matches);<br />
ログイン後にコピー

これは最後にドル記号を追加すると何も一致しませんが、これには影響しません。理由はわかります。オンラインでドキュメントを見ると、用語のヘッダーがたくさんあります。誰かが答えてくれると嬉しいです。ありがとうございます。

こんにちは、1000 ポイントしか持っていないのに、なぜ 100 ポイントしか与えられないのですか? 。 。
------解決策のアイデア----------------------
$_content =<<< HTML<br /><!-- Layout name="header" --><br /><!-- Layout name="footer" -->
HTML;<br />preg_match( '/^<!--\sLayout\sname\s*=\s*"(.*)"\s-->/', $_content, $matches);<br />print_r($matches);
ログイン後にコピー
Array<br />(<br />    [0] => <!-- Layout name="header" --><br />    [1] => header<br />)<br />
ログイン後にコピー
問題ありません

あなた自身が混乱しているだけです
$matches[0] はテキストモードでのみ表示される HTML タグです
-----解決策のアイデア- ----------
<br />$_content='<!-- Layout name="header" --><br /><!-- Layout name="footer" -->';<br />preg_match_all('/<!--\sLayout\sname\s*=\s*"(.*?)"\s-->/', $_content, $matches);<br /><br />print_r($matches);<br />/*<br />Array<br />(<br />    [0] => Array<br />        (<br />            [0] => <!-- Layout name="header" --><br />            [1] => <!-- Layout name="footer" --><br />        )<br /><br />    [1] => Array<br />        (<br />            [0] => header<br />            [1] => footer<br />        )<br /><br />)<br />*/<br />
ログイン後にコピー

$matches[0] には完全なパターン一致テキストが含まれます の後には別の文があります: $matches[1] には最初のキャプチャ サブグループに一致するテキストが含まれます。など、
にはアンチ キャプチャのみが含まれることを意味します。括弧で囲まれたコンテンツ) ではなく、グローバル マッチングを実行する代わりに preg_match_all を使用してグローバル マッチング
を実行し、正規表現の先頭に ^ を追加します。これは、マッチングを実行する文字列を示します。 ^ なので、 は一致できません
同様に、$ は、一致する文字列が $ より前で終了する必要があることを意味するため、コンテンツ $_content と一致する必要があります。 =''; または $_content=''; と一致させることができます。 >------解決策-----------
^ は、文字列が一致する場合、一致する入力文字列の位置の始まりです。 be matched が ^ 以降の内容で始まっていない場合、マッチングは一切行われません

文字列が bbs で始まらない
と判断するだけなら、こちらの方が早いです
$str='/bbs/www/csdn/net/xxx/';<br />if(strpos($str,'bbs')!=0 <br><font color='#FF8000'>------解决思路----------------------</font><br> strpos($str,'bbs')===false){<br />	//等于0就是以bbs开头,未找到返回false(全等于false)<br />	echo 'exe';<br />}
ログイン後にコピー
-----解決策のアイデア----------------------

<br />$str='www/bbs/net/xxx/';<br />if(preg_match('/^bbs.+?/', $str)){<br />	echo '以bbs开头';<br />}else{<br />	echo 'exe';<br />}<br />
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート