【问题标题】:get number after string php regex在字符串 php 正则表达式之后获取数字
【发布时间】:2013-03-12 23:34:11
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 大字符串中的数字不止这个(我只是拿了一块)所以我只想要“帐号”后面的数字而不是任何其他数字
  • 它们也不一定是有序的
  • 顺便说一句,HTML 格式错误。

标签: php regex


【解决方案1】:

如果数字总是在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);

【讨论】:

  • 返回的是一个空数组……难道这是来自电子邮件?我也在使用quoted_printable_decode(): $fullBody = imap_fetchbody($mbox,$email_number, 1.0); $str =quoted_printable_decode($fullBody);
  • 这可能是因为您的文本中有隐藏字符。复制并粘贴您拥有的文本,它可以在 www.myregextester.com 上使用。
  • 啊,如果是 HTML 那就更有意义了。是的,这些 HTML 字符在正则表达式中被考虑在内。如果您知道该代码中的 html 标签,则可以将其添加到您的正则表达式中,如果您知道它们不会更改或包含比现在更多的属性,或者使用HTML DOM Parser。跨度>
  • 假设 HTML 没有改变,那么我在编辑中提供的正则表达式将起作用。如果它确实发生了变化,最好在使用正则表达式之前使用解析器。
  • 是的...我认为这不是一个好主意。我使用了您提到的 HTML DOM Parser,现在我认为这一切都在一行中......至少它在浏览器中看起来像纯文本......这是解析器显示的确切字符串:OUNT Account Number: 033 Account呐……
【解决方案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(),您也没有通过将匹配项放在括号中来将其放入反向引用中。

【讨论】:

    【解决方案3】:

    以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"
        }
    }
    

    【讨论】:

      【解决方案4】:

      @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
      

      【讨论】:

        猜你喜欢
        • 2018-04-30
        • 2021-12-17
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 2014-05-04
        • 2021-09-07
        相关资源
        最近更新 更多