regex 获取HTML中出现在其标签文本之后的数字

06odsfpq  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(94)

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

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

bfhwhh0e

bfhwhh0e1#

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

iswrvxsc2#

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

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

echo $matches[1]; // 033

你不需要使用preg_match_all(),你也没有把你的匹配放在一个括号内的反向引用。

mrphzbgm

mrphzbgm3#

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

ajsxfq5m4#

@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

相关问题