2

たとえば、次の文字列があるとします。

var a=23434,bc=3434,erd=5656,ddfeto='dsf3df34dff3',eof='sdfwerwer34',wer=4554;

整数として割り当てられたすべての初期化をどのように一致させる必要がありますか?これが私の現在の試みですが、なぜそれがすべてに一致するのかわかりません。

$pattern = '/var (.*=\d)/';
preg_match_all($pattern,$page,$matches);

編集:私は各初期化を一致させようとしています:

1 => a=23434
2 => bc=3434

等々...

編集:これが私の試みの更新です:

$pattern = '/[^v^a^r] (.*=\d+),/';
preg_match_all($pattern,$page,$matches);

0 => 'var a=23434,bc=3434,erd=5656,'
1 => 'a=23434,bc=3434,erd=5656'
4

3 に答える 3

2

関数は「貪欲な」マッチングを使用しています。あなたはそれを望んでいません。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,]*任意の数の非空白文字、非コンマ文字と一致します。これは、テストケースでも機能します。

しかし、この場合、含めたい文字を自信を持って言うことができるので、文字を「ブラックリストに登録」する代わりに「ホワイトリストに登録」します。この場合、大文字と小文字のいずれかのアルファベット文字に一致させることを指定します。

多くの場合と同様に、特にプログラミングでは、猫の皮を剥ぐ方法がたくさんあります。テストケースでも機能する代替正規表現パターンが多数あります。それぞれの制限、エッジケースでのパフォーマンス、メンテナンスのしやすさを理解し、決定を下すのはあなた次第です。

于 2012-06-25T10:40:00.680 に答える
1

この正規表現を試してください

$pattern = '/([a-zA-Z]+=\d+)/';
于 2012-06-25T10:48:25.847 に答える
1

正規表現を使用する必要はありません:

$string = substr($string, 4); // remove the first 4 characters, 'var '
$pairs = explode(',', $string); // split using the comma
foreach ($pairs as $pair) {
    list($key, $value) = explode('=', $pair);
    if (is_int($value)) {
        // this is an integer
    } else {
        // not an integer
    }
}
于 2012-06-25T10:41:22.030 に答える