関数は「貪欲な」マッチングを使用しています。あなたはそれを望んでいません。PHP では、次のように、ワイルドカードの後に aを付け?
て、非貪欲な一致を指定できます。
$pattern = '/var (.*?=\d)/';
または、次のように、ここに記載されU
ているフラグを使用します。
$pattern = '/var (.*=\d)/U';
これにより、すべてのワイルドカードが貪欲でない一致を使用するようになります。
編集:また、「var」を含めているため、おそらく変更する必要があります
$pattern = '/var (.*?=\d)*/';
また
$pattern = '/var (.*=\d)*/U';
(.*=\d)
任意の数のパターンに一致します。
編集:ディスカッションごとに更新:
PHP
$page = "var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwerwer34',wer=4554;";
$pattern = '/([a-zA-Z]+=\d+)/';
preg_match_all($pattern,$page,$matches);
print_r($matches[1]);
プロデュース
Array
(
[0] => a=23434
[1] => bc=3434
[2] => erd=5656
[3] => wer=4554
)
注: これにより、単一引用符で囲まれた RHS を持つエントリが除外されます。それを望まない場合は、お知らせください。
編集 #2 : あなたの質問に対する私の回答がコメント ボックスのサイズを超えていたため、回答を編集しました。
式は、大文字と小文字のいずれかの[a-zA-z]
アルファベット文字のみに一致します。更新されたコードでは「貪欲でない」修飾子も削除されていることに注意してください。そして貪欲であってほしいので、.
「食べ過ぎ」てしまいます。さあ、コードをいじってみてください。変更するとどうなるか見てみましょう.*
。これは、正規表現に慣れる良い機会です。
.
「食べる」が多すぎるため、すべての文字に一致することから、必要な文字に一致するように制限する必要があります。次のようなものを使用できたはずです
$pattern = '/([^\s,]*=\d+)/';
は、[^\s,]*
任意の数の非空白文字、非コンマ文字と一致します。これは、テストケースでも機能します。
しかし、この場合、含めたい文字を自信を持って言うことができるので、文字を「ブラックリストに登録」する代わりに「ホワイトリストに登録」します。この場合、大文字と小文字のいずれかのアルファベット文字に一致させることを指定します。
多くの場合と同様に、特にプログラミングでは、猫の皮を剥ぐ方法がたくさんあります。テストケースでも機能する代替正規表現パターンが多数あります。それぞれの制限、エッジケースでのパフォーマンス、メンテナンスのしやすさを理解し、決定を下すのはあなた次第です。