2010-10-10 45 views
24

Tôi có một khối văn bản mà từ đó tôi muốn trích xuất các địa chỉ e-mail hợp lệ và đặt chúng vào một mảng. Cho đến nay tôi có ...Trong PHP, làm thế nào để trích xuất nhiều địa chỉ e-mail từ một khối văn bản và đặt chúng vào một mảng?

$string = file_get_contents("example.txt"); // Load text file contents 
    $matches = array(); //create array 
    $pattern = '/[A-Za-z0-9_-][email protected][A-Za-z0-9_-]+\.([A-Za-z0-9_-][A-Za-z0-9_]+)/'; //regex for pattern of e-mail address 
    preg_match($pattern, $string, $matches); //find matching pattern 

Tuy nhiên, tôi nhận được một mảng chỉ có một địa chỉ. Vì vậy, tôi đoán tôi cần phải chu kỳ thông qua quá trình này bằng cách nào đó. Làm thế nào để làm điều đó?

Trả lời

11

Mã của bạn là gần như hoàn hảo, bạn chỉ cần thay thế preg_match(...) với preg_match_all(...)

http://www.php.net/manual/en/function.preg-match.php

http://www.php.net/manual/en/function.preg-match-all.php

+0

Cảm ơn bạn rất nhiều !! Giờ tôi đang đến gần. Sản lượng của tôi tuy nhiên trông hơi lạ với tôi. Tôi dường như nhận được mảng trong mảng của tôi như sau: Array ([0] => Array ([0] => example @ slu.edu) [1] => Mảng ([0] => edu)) – HumbleHelper

+0

Tôi đang tìm kiếm một mảng đơn giản với mỗi khóa có chứa một địa chỉ e-mail. – HumbleHelper

+1

@HumbleHelper preg_replace_all sẽ tạo các phần tử mảng mới cho các bản con của bất kỳ thứ gì nằm trong dấu ngoặc đơn trong mẫu gốc. Bạn có dấu ngoặc đơn quanh phần cuối cùng là miền trong mẫu của bạn. Để khắc phục điều này, bạn chỉ có thể nối thêm $ matches = $ matches [0] ở cuối. Ngoài ra, hãy nhìn vào câu trả lời của Clay Hinson. Anh xứng đáng với câu trả lời được chấp nhận. – stevendesu

18

Tôi biết đây không phải là câu hỏi mà bạn hỏi nhưng tôi nhận thấy rằng regex của bạn không được chấp nhận bất kỳ địa chỉ nào như '[email protected]' hoặc bất kỳ địa chỉ nào có tên miền phụ. Bạn có thể thay thế bằng thứ gì đó như:

/[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}/ 

sẽ từ chối ít email hợp lệ hơn (mặc dù nó không hoàn hảo).

Tôi cũng đề nghị bạn đọc this article on e-mail validation, nó khá tốt và có nhiều thông tin.

+1

Cảm ơn bạn đã sugestion của bạn! Tôi đã sử dụng phản ứng @Clay Hinson nhưng điều đó không hoạt động với các tên miền phụ. Tôi đã hợp nhất 2 câu trả lời và tôi nhận được câu trả lời: "/[a-z0-9_.\-\+]{1,256}[email protected][a-z0-9\-\.]+\.([az]{2, 4})/i "Tôi đã sử dụng strtolower() trên email var, vì vậy nó không yêu cầu AZ – jaysponsored

+0

Bạn thật tuyệt vời! –

+0

Regex này hoạt động, câu trả lời từ câu trả lời @Clay Hinson không – Crasher

28

Bạn đang khá gần, nhưng regex sẽ không bắt tất cả các định dạng email và bạn không cần chỉ định A-Za-z, bạn chỉ có thể sử dụng cờ "i" để đánh dấu toàn bộ biểu thức là trường hợp không nhạy cảm. Có những trường hợp định dạng email bị bỏ sót (đặc biệt là các tên miền phụ), nhưng điều này bắt được những trường hợp tôi đã thử nghiệm.

$string = file_get_contents("example.txt"); // Load text file contents 

// don't need to preassign $matches, it's created dynamically 

// this regex handles more email address formats like [email protected], and the i makes it case insensitive 
$pattern = '/[a-z0-9_\-\+][email protected][a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i'; 

// preg_match_all returns an associative array 
preg_match_all($pattern, $string, $matches); 

// the data you want is in $matches[0], dump it with var_export() to see it 
var_export($matches[0]); 

đầu ra:

array (
    0 => '[email protected]', 
    1 => '[email protected]', 
    2 => '[email protected]', 
    3 => '[email protected]', 
    4 => '[email protected]', 
) 
+0

+1 để biết thêm chi tiết hơn câu trả lời của tôi, mã ví dụ và mẫu bắt các tên miền phụ. Điều này nên được chấp nhận câu trả lời. – stevendesu

+0

Vâng! .. nó hoạt động tốt ... – VKGS

+3

Giải pháp này là lỗi, trừ khi bạn sửa chữa nó. Regex ở trên phá vỡ email '[email protected]', nơi phần cuối cùng chứa 4 ký tự. Bạn regex trả về '[email protected]'. Hãy sửa chữa. – Eye

1

regex này sẽ trích xuất tất cả địa chỉ email duy nhất từ ​​một url hoặc tập tin và sản lượng mỗi trong dòng mới. Nó sẽ xem xét tất cả các tên miền phụ và các vấn đề hậu tố tiền tố. Tìm thấy thoải mái để sử dụng nó.

<? 
$url="http://example.com/"; 
$text=file_get_contents($url); 
$res = preg_match_all(
"/[a-z0-9]+[_a-z0-9\.-]*[a-z0-9][email protected][a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})/i", 
$text, 
$matches 
); 
if ($res) { 
foreach(array_unique($matches[0]) as $email) { 
echo $email . "<br />"; 
} 
} 
else { 
echo "No emails found."; 
} 
?> 

check vào đây để tham khảo thêm: http://www.php.net/manual/en/function.preg-match-all.php

4

này phát hiện tất cả các địa chỉ mail:

$sourceeee= 'Here are examplr [email protected] and [email protected] or something more'; 

preg_match_all('/[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i', $sourceeee, $found_mails); 

sau đó bạn có thể sử dụng $found_mails[0] mảng.

0

Nó làm việc tốt hơn cho tôi:

<?php 
$content = "Hi my name is Joe, I can be contacted at [email protected]"; 
preg_match("/[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})/i", $content, $matches); 
print $matches[0]; 
?> 

Một số người khác không chấp nhận các lĩnh vực như: [email protected]

Tôi tìm thấy nó trên: http://snipplr.com/view/63938/

0

này chức năng hoạt động tốt mà không sử dụng regex. Vì vậy, nó thực sự là nhanh và thấp tài nguyên đói.

<?php 
function extract_email_addresses($str){ 
    $emails = array(); 
    $str = strip_tags($str); 
    $str = preg_replace('/\s+/', ' ', $str); 
    $str = preg_replace("/[\n\r]/", "", $str); 
    $remove_chars = array (',', "<", ">", ";", "'", ". "); 
    $str = str_replace($remove_chars, ' ', $str); 
    $parts = explode(' ', $str); 
    if(count($parts) > 0){ 
     foreach($parts as $part){ 
      $part = trim($part); 
      if($part != '') { 
       if(filter_var($part, FILTER_VALIDATE_EMAIL) !== false){ 
        $emails[] = $part; 
       }     
      } 
     } 
    } 
    if(count($emails) > 0){ 
     return $emails; 
    } 
    else{ 
     return null; 
    } 
} 

$string = "Guys, please help me to extract valid [email protected] email addresses from some text content using php 
example , i have below text content in mysql database ' Life is more beautiful, and i like to explore lot please email me to [email protected] Learn new things every day. 'from the above text content i want to extract email address '[email protected]' using php regular expressions or other method."; 

$matches = extract_email_addresses($string); 
print_r($matches); 

?> 
Các vấn đề liên quan