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

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

WBOY
リリース: 2016-06-23 13:47:41
オリジナル
977 人が閲覧しました

正規表現を書きます。これは通常は一致しますが、一致した文字列全体を返すためにも必要です

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

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


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


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

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

別の問題があります。なぜ一致しないのかわかりません。このように、最後にドル記号を追加すると何も一致しませんが、オンラインのドキュメントを見ていて、その理由が知りたいです。誰かが私に答えてくれることを願っています。ありがとう。

めまい、1,000 ポイント持っているのに、なぜ 100 ポイントしかあげられないのですか? 。 。

ディスカッションに返信(解決策)

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 は ^ の後のコンテンツで始まる必要があるため、 は一致できません
同様に、$ は、一致する文字列が $ より前で終了する必要があることを意味します。したがって、コンテンツと一致するには、$_content=''; または $_content='';

$_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 タグです

これで完了です! ! ! HTMLのコメントタグを忘れてしまい、本当に一晩中気を失いました。

Array(    [0] => <!-- Layout name="header" -->    [1] => header)
ログイン後にコピー
ログイン後にコピー

$matches[0] には完全なパターン
に一致するテキストが含まれ、その後に次の文が続きます: $matches[1] には最初にキャプチャしたサブグループに一致するテキストが含まれます など。実行されるグローバル マッチングではなく、アンチキャプチャ (つまり、括弧で囲まれたコンテンツ) のみを含める必要があるため、グローバル マッチングを実行するには preg_match_all を使用します また、正規表現の前に ^ を追加することを意味します。一致する文字列は ^ の後のコンテンツから始まる必要があるため、 は一致できません
同様に、$ は一致する文字列の末尾が $ で始まる必要があることを意味します。コンテンツに一致します。 $_content=''; または $_content=' '; to

まだ理解できませんが、比較が $content[0] からしか開始できないのは ^ を使用した後ですか?前の文字列が同じ場合は一致します。 $ 同じことですか?


解決してほしい問題がもう 1 つあります

文字列があります

$_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        ))*/
ログイン後にコピー
ログイン後にコピー


文字列が bbs で始まらない場合は、一致させます
たとえば、
$string = 'bbs/csdn/net/xxx';
ログイン後にコピー

bbs で始まらないため、続けてくださいmatch

方法を考えました 書き方
$string = 'www/csdn/net/xxx';
ログイン後にコピー

でも、この効率は少し低いような気がします 最適化できないかな?

^ はマッチングする入力文字列の開始位置です。 マッチング対象の文字列が ^ 以降の内容で始まらない場合はマッチングは一切行われません

文字列が始まらないとだけ判断した場合bbs
だと、こっちのほうが早い
^ はマッチングする入力文字列の開始位置で、マッチング対象の文字列が ^ 以降の内容で始まらない場合、マッチングは全く行われません

文字列が bbs で始まっていないと判断されるだけです

、このように比較してください 高速

preg_match( '#((?!bbs/).)*#', 'www/csdn/net/xxx/', $matches);
ログイン後にコピー

いや、実際には Django のような URL ルーティング関数を書きたいのですが、上記の方法に従うと、スケーラビリティは強くありません。もう十分なので、正規表現を使いたいです

$str='/bbs/www/csdn/net/xxx/';if(strpos($str,'bbs')!=0 || strpos($str,'bbs')===false){	//等于0就是以bbs开头,未找到返回false(全等于false)	echo 'exe';}
ログイン後にコピー

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