0

競馬の距離に合わせてpreg_match_allを修正しようとしています。

私の情報源は人種を次のようにリストしています:xmxfxy m値、f値、y値を一致させたい。ただし、異なる種族には、m、f、y、または2つ、あるいは3つすべてしか含まれない可能性があります。

// e.g. $raw = 5f213y;

preg_match_all('/(\d{1,})m|(\d{1,})f|(\d{1,})y/', $raw, $distance);

上記の種類は機能しますが、何らかの理由で、返された配列の予測できない位置に一致が表示されます。ORごとに3回マッチを実行しているからだと思います。1回の実行で3つすべて(存在する場合と存在しない場合があります)を一致させるにはどうすればよいですか。

編集完全なサンプル文字列は次のとおりです。

Hardings Catering Services Handicap (Div I) Cl6 5f213y
4

3 に答える 3

1

私があなたを正しく理解しているなら、あなたは(あなたの質問のような)リストを一度に一つずつ処理しています。その場合は、を使用する必要があります。正規表現は、個々のコンポーネントではpreg_matchなくpreg_match_all、「距離」コード全体と一致する必要があります。これを試して:

preg_match('#\b(?:(?<M>\d+)m|(?<F>\d+)f|(?<Y>\d+)y){1,3}\b#',
           $raw, $distance);

結果は1次元配列に格納されるようになりましたが、グループ番号について心配する必要はありません。代わりに名前でアクセスできます(例、、、$distance['M'])。$distance['F']$distance['Y']

この正規表現は、1つ、2つ、または3つのコンポーネントを持つコードと一致しますが、文字が一意である必要はないことに注意してください。それが次のようなものと一致するのを止めるものは何もありません1m2m3m(ちなみに、あなた自身のアプローチによって共有される弱点)。

于 2010-08-18T05:22:44.917 に答える
0

「?」を使用できます 条件付きとして

preg_match_all('/((\d{1,})m)?|((\d{1,})f)?|((\d{1,})y)?/', $raw, $distance);
于 2010-08-17T14:29:22.290 に答える
0

あなたが正しく質問していることを私が理解しているなら、あなたはこれらの値からそれぞれの数字を別々に取得したいですか?これは私のために働きます:

$input = "Hardings Catering Services Handicap (Div I) Cl6 5f213y";

preg_match_all('/((\d+)(m|f|y))/', $input, $matches);

preg_match_all()実行後、$matches[2]一致した数値の配列を保持します(この場合、$matches[2][0]は5で、$matches[2][1]は213です。

3つの値がすべて存在する場合、mは$matches[2][0]、fは$matches[2][1]、、yは。になり$matches[2][2]ます。欠落している値がある場合、次の値はスポットにぶつかります。$matches[3]対応する文字の配列が一致する場合にも便利な場合があるため、m、f、またはyのいずれであるかを確認する必要がある場合は可能です。

これが目的ではない場合は、この入力または別のサンプル入力に対して表示する出力の例を提供してください。

于 2010-08-18T01:17:22.213 に答える