2013-03-23 197 views
0

我正在使用PHP解析電子郵件並希望獲得特定字符串後的數字: 例如,我想從此字符串獲取數字033:獲取字符串後的數字php正則表達式

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

有不僅僅是這在較大的字符串更多的數字(我只是拿了一塊),所以我不僅會想要「帳號」後面的數字,而不是其他數字 – Bill 2013-03-23 00:13:17

+0

它們可能不一定是 – Bill 2013-03-23 00:14:47

+0

這個HTML是畸形的順便說一句。 – 2013-08-22 10:44:10

回答

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); 
+0

這是返回一個空陣列...可能是這是來自電子郵件?我也使用quoted_printable_decode():$ fullBody = imap_fetchbody($ mbox,$ email_number,1.0); \t \t \t $ str = quoted_printable_decode($ fullBody); – Bill 2013-03-23 00:21:24

+0

這可能是因爲文字中的隱藏字符。複製並粘貼您的文本,並且它可以在www.myregextester.com上使用。 – Josh 2013-03-23 00:27:09

+0

嗯...所以我需要將HTML轉換爲純文本也許.... – Bill 2013-03-23 00:27:42

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()你也沒有把你的比賽放在括號內,作爲反向引用。

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

+1我忘了'strip_tags'。如果這有效,那麼這應該是答案。 – Josh 2013-03-23 00:48:49