0

我知道我现在只是头脑简单,但我很难过。假设我有一个如下所示的文本目标:

约翰尼实际上是以他 1234 年的祖父 John Hugenot 命名的,但他的 T5677 id 是 JH6781,他弟弟的 HG766 id 是 RB1223。

使用这个 RegExp: \s[A-Z][A-Z]\d\d\d\d\s,我将如何分别提取匹配字符串的第一次和第二次出现?分别为“JH6781”和“RB1223”。我保证匹配的字符串在目标文本中恰好出现两次。

注意:我根本不想更改现有字符串,所以str_replace()不是一个选项。

4

3 回答 3

4

呃......如何使用这个正则表达式:

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

它的意思是“匹配一个单词的边界,后跟两个大写英文字母,后跟四个数字,然后是一个单词边界”。所以它不会匹配'TGX7777'(单词边界后面跟着三个字母 - 模式匹配失败),它不会匹配'TX77777'(四个数字后面跟着另一个数字 - 再次失败)。

这就是它的使用方式:

$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选择第一次和第二次出现。或者,您可以使用preg_match_all并且只使用前两个数组条目

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