1

我正在使用 PHP 来解析电子邮件并希望获取特定字符串之后的数字:例如,我想从此字符串中获取数字 033:

 Account Number: 033 
 Account Information: Some text here

总是有单词 Account Number: 然后是数字,然后是换行符。我有:

 preg_match_all('!\d+!', $str, $matches);

但这只是得到所有的数字......

任何帮助都会很棒!谢谢

编辑:

文本是 HTML ......这可能是问题所在:

    <font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font color="#660000">Account 
     Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>
4

4 回答 4

11

如果数字总是在后面Account Number: (包括末尾的那个空格),那么只需将其添加到您的正则表达式中:

preg_match_all('/Account Number: (\d+)/',$str,$matches);
// The parentheses capture the digits and stores them in $matches[1]

结果:

$matches Array:
(
    [0] => Array
        (
            [0] => Account Number: 033
        )

    [1] => Array
        (
            [0] => 033
        )

)

注意:如果存在 HTML,则可以将其包含在正则表达式中,只要您不相信 HTML 会发生变化。否则,我建议使用HTML DOM Parser来获取字符串的纯文本版本并从那里使用正则表达式。

话虽如此,以下是在正则表达式中包含 HTML 并提供与上述相同的输出的示例:

// Notice the delimiter 
preg_match_all('@<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font color="#660000">Account 
Number</font></strong><font color="#660000">: (\d+)@',$str,$matches);
于 2013-03-23T00:11:30.777 回答
3
$str = 'Account Number: 033 
 Account Information: Some text here';

preg_match('/Account Number:\s*(\d+)/', $str, $matches);

echo $matches[1]; // 033

您也不需要使用preg_match_all()您没有通过将匹配放在括号中来将其放入反向引用中。

于 2013-03-23T00:12:20.990 回答
1

以 HTML 为基础:

$str = '<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font
    color="#660000">Account Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>';
preg_match_all('!Account Number:\s+(\d+)!ims', strip_tags($str), $matches);
var_dump($matches);

我们得到:

array(2) {
    [0]=>
    array(1) {
        [0]=>
        string(19) "Account Number: 033"
    }
    [1]=>
    array(1) {
        [0]=>
        string(3) "033"
    }
}
于 2013-03-23T00:45:00.407 回答
0

@montesstrip_tags()在使用正则表达式提取目标子字符串之前适当地调用以清理/简化输入文本。但是,该模式可以进行一些改进,并假设每封电子邮件只有一个帐号,您不应该使用preg_match_all(), 而是preg_match().

  • 不需要不区分大小写,因此i模式修饰符没有意义。
  • 模式中没有^$元字符,所以m模式修饰符没有用。
  • 模式中没有.元字符,所以s模式修饰符没有用。
  • \K重新开始全串匹配。这是有益的,因为它消除了使用捕获组的必要性。

代码:(演示

$html = '<font face="Arial, Helvetica, sans-serif" color="#000099"><strong><font
    color="#660000">Account Number</font></strong><font color="#660000">: 033<br>
    <strong>Account Name</strong>: More text here<br>';

echo preg_match('~Account Number:\s*\K\d+~', strip_tags($html), $match)
     ? $match[0]
     : 'No Account Number Found';

输出:

033
于 2020-08-28T08:37:51.030 回答