I recently discovered the file_get_contents
function and wanted to put it to some use, alongside preg_match_all
, off the information in this Stack Overflow thread.
<?php
//use a site with lots of email address on.
$string = file_get_contents("https://stackoverflow.com/questions/3901070/in-php-how-do-i-extract-multiple-e-mail-addresses-from-a-block-of-text-and-put");
//initialise an empty array.
$matches = array();
//regular expression that matches most email addresses, courtesy of @Eric-Karl.
$pattern = '/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}/';
//perform global regular expression match, ie search the entire web page for a particular thing, and store it in the previously initialised array.
preg_match_all($pattern, $string, $matches);
//output array of values; remove duplicate email addresses, but maintain incremental key count.
var_dump(array_values(array_unique($matches[0])));
//store above in array for upcoming bit.
$neaterArray = array_values(array_unique($matches[0]));
//count the amount of variables in the array.
$count = count($neaterArray);
//implode array values to string.
$emailsAsString = implode(", ", $neaterArray);
//present the string, prepended with the count.
echo "<h3>$count email addresses in total:</h3> $emailsAsString";
?>
I trust my comments are enough to justify the choices I made. I used the stackoverflow thread I mentioned as a test case, because it had many test/fake emails, but all in an appropriate format for the regex.
Here's the output for this case:
array (size=19) 0 => string 'apple-touch-icon@2.png' (length=22) 1 => string 'example@slu.edu' (length=15) 2 => string 'a+b@google.com.sg' (length=17) 3 => string 'test1+2@gmail.com' (length=17) 4 => string 'test-2@yahoo.co.jp' (length=18) 5 => string 'test@test.com' (length=13) 6 => string 'test@test.co.uk' (length=15) 7 => string 'test@google.com.sg' (length=18) 8 => string 'email@domain.info' (length=17) 9 => string 'email@domain.inf' (length=16) 10 => string 'first.lastname@domain.be' (length=24) 11 => string 'lastname@domain.be' (length=18) 12 => string 'HIDDENFORLOGICALREASONS@cameranh.rs.gov.br' (length=42) 13 => string 'HIDDENFORLOGICALREASONS@cameranh.rs.go' (length=38) 14 => string 'myemail@office21.company.com' (length=28) 15 => string 'mymail@yahoo.com' (length=16) 16 => string 'my-e.mail@yahoo.com' (length=19) 17 => string 'joe@mysite.com' (length=14) 18 => string 'name@example.com.sv' (length=19) 19 email addresses in total: apple-touch-icon@2.png, example@slu.edu, a+b@google.com.sg, test1+2@gmail.com, test-2@yahoo.co.jp, test@test.com, test@test.co.uk, test@google.com.sg, email@domain.info, email@domain.inf, first.lastname@domain.be, lastname@domain.be, HIDDENFORLOGICALREASONS@cameranh.rs.gov.br, HIDDENFORLOGICALREASONS@cameranh.rs.go, myemail@office21.company.com, mymail@yahoo.com, my-e.mail@yahoo.com, joe@mysite.com, name@example.com.sv
I realise the string at the end isn't particularly necessary, I just wanted to make use of implode
.
Some questions:
Is this a good way to go about solving the problem? Are there parts that could be optimised with more suitable functions?
Is initialising the array imperative for this program? I tried it without the original declaration (in the
preg_match_all
line) and it still functioned.Is there a part/are there parts of the code that comes across as poorly written?