获取 HTML 中标签文本后面出现的数字

问题描述 投票:0回答:4

我正在使用 PHP 解析电子邮件,并希望获取特定字符串后的数字。

例如,我想从如下字符串中获取数字 033:

 Account Number: 033 
 Account Information: Some text here

内容实际上是 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>
    

总是有单词

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

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

但这只是得到所有数字。

php html regex preg-match text-extraction
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);
    

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()

,而且您也没有通过将匹配放在括号内来将其放入反向引用中。


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

0
投票
@montes 会适当地调用

strip_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
    
© www.soinside.com 2019 - 2024. All rights reserved.