0

この時点で単純に考えていることはわかっていますが、困惑しています。次のようなテキスト ターゲットがあるとします。

ジョニーは実際には 1234 年の祖父であるジョン・ヒューグノーにちなんで名付けられましたが、彼の T5677 id は JH6781 で、弟の HG766 id は RB1223 でした。

この RegExp: を使用して\s[A-Z][A-Z]\d\d\d\d\s、一致する文字列の最初と 2 番目の出現を個別に抽出するにはどうすればよいでしょうか? それぞれ「JH6781」と「RB1223」。一致する文字列がターゲット テキストに正確に 2 回表示されることを保証します。

注:既存の文字列をまったく変更したくstr_replace()ないので、オプションではありません。

4

3 に答える 3

4

えーと...この正規表現を使用するのはどうですか:

/\b[A-Z]{2}\d{4}\b/

これは、「単語の境界に一致し、その後に正確に 2 つの大文字の英字が続き、その後に正確に 4 つの数字が続き、その後に単語の境界が続く」ことを意味します。そのため、「TGX7777」 (単語境界の後に 3 文字が続く - パターン マッチに失敗) とは一致せず、「TX77777」 (4 桁の後に別の数字が続く - 再び失敗) とは一致しません。

そして、それはそれがどのように使用できるかです:

$str = "Johnny was really named for his 1234 grandfather, John Hugenot, but his T5677 id was JH6781 and his little brother's HG766 id was RB1223.";

preg_match_all('/\b[A-Z]{2}\d{4}\b/', $str, $matches);
var_dump($matches[0]); 
// array
//  0 => string 'JH6781' (length=6)
//  1 => string 'RB1223' (length=6)
于 2012-09-18T22:42:35.983 に答える
3
$s='Johnny was really named for his 1234 grandfather, John Hugenot, but his T5677 id was JH6781 and his little brother\'s HG766 id was RB1223.';
$n=preg_match_all('/\b[A-Z][A-Z]\d\d\d\d\b/',$s,$m);

結果を与える$n=2、その後

print_r($m);

結果を与える

Array
(
    [0] => Array
        (
            [0] => JH6781
            [1] => RB1223
        )
)
于 2012-09-18T22:45:41.840 に答える
1

preg_matchとオフセット パラメータ (5 番目) を組み合わせて使用​​しstrpos、最初と 2 番目のオカレンスを選択することができます。preg_match_allまたは、最初の 2 つの配列エントリを使用して使用することもできます

<?php
$first = preg_match($regex, $subject, $match);
$second = preg_match($regex, $subject, $match, 0, strpos($match[0]) + 1);
?>
于 2012-09-18T22:41:58.373 に答える