2013-10-16 113 views
1

我必須從以下字符串中提取電子郵件的一個組成部分:PHP提取字符串

$string = 'other_text_here to=<[email protected]> other_text_here <[email protected]> other_text_here'; 

服務器發送我的日誌,並在那裏,我有這種格式的,我怎麼能得到的電子郵件進入沒有「到= <」和「>」變量?

更新:我已經更新了這個問題,好像這個電子郵件可以在字符串中找到很多次,並且正常的表達式不能很好地與它一起工作。

if (preg_match_all('/<(.*?)>/', $string, $emails)) { 
    array_shift($emails); // Take the first match (the whole string) off the array 
} 
// $emails is now an array of emails if any exist in the string 

括號告訴它捕捉到了$matches數組:如果您確信<>字符串中,不使用其他任何地方

回答

2

您可以嘗試更嚴格的正則表達式。

$string = 'other_text_here to=<[email protected]> other_text_here'; 
preg_match('/to=<([A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4})>/i', $string, $matches); 
echo $matches[1]; 
0

Regular expression很容易。 .*接收任何字符,並且?告訴它不是貪婪的,所以>不會被拾取。

+0

它不會讓我接受answere,但我會盡快完成,thx –

+0

啊,是的好趕上。固定! –

+0

我已經更新了這個問題,我發現服務器可以多次打印到該電子郵件的日誌中,並且正常的表達式在這種情況下效果不佳。 –

1

簡單的正則表達式應該能夠做到這一點:

$string = 'other_text_here to=<[email protected]> other_text_here'; 
preg_match("/\<(.*)\>/", $string, $r); 
$email = $r[1]; 

當你echo $email,你"[email protected]"

+0

這裏的其他解決方案使用(。*?),這對大多數正則表達式來說是非常適當的,在電子郵件地址之後處理鬆散的前導或尾隨< and >。但是,在我看來,除非你從一段文本中提取了一堆電子郵件,否則你不能在這裏預測這些字符,所以你需要另一種方法。換句話說,對格式限制有一個合理的期望。 – pp19dd

0

試試這個:

<?php 
$str = "The day is <tag> beautiful </tag> isn't it? "; 
preg_match("'<tag>(.*?)</tag>'si", $str, $match); 
$output = array_pop($match); 
echo $output; 
?> 

輸出:

美麗