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