字符串php正则表达式后得到数字

时间:2013-03-23 00:05:15

标签: php regex

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

 Account Number: 033 
 Account Information: Some text here

总是会出现“帐号”这个词:然后是数字,然后是换行符。我有:

 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 个答案:

答案 0 :(得分:8)

如果数字始终在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);

答案 1 :(得分:2)

$str = 'Account Number: 033 
 Account Information: Some text here';

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

echo $matches[1]; // 033

您也不需要使用preg_match_all(),也不要将匹配放在括号中,而不是将其放入反向引用中。

答案 2 :(得分: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"
    }
}

答案 3 :(得分:0)

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

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

代码:(Demo

$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