Link to home
Start Free TrialLog in
Avatar of Nura111
Nura111

asked on

HOe to remove chars with php function?

Im tring to extract the email from the next strin
I tried using str_replace but it didnt helped for "<" " >"

From: <email@name.com>
Avatar of PranjalShah
PranjalShah
Flag of United States of America image

Are you trying to extract just email or email@name.com?
Avatar of Nura111
Nura111

ASKER

email@name.com
You can use a regular expression with groups to get the information around the @ sign.  I'll show you an example in a moment.
http://www.laprbass.com/RAY_temp_nura111.php
<?php // RAY_temp_nura111.php
error_reporting(E_ALL);
echo "<pre>";

// TEST DATA
$st1 = 'From: <email@name.com>';
$st2 = 'From: email@name.com';

$rgx
= '#'               // REGEX DELIMITER
. '\b'              // WORD BOUNDARY
. '([^ ]*?)'        // GROUP OF NON-BLANK CHARACTERS
. '([@]){1}'        // GROUP OF EXACTLY ONE AT-SIGN
. '(.*?)'           // GROUP OF ANYTHING
. '([.]){1}'        // GROUP OF EXACTLY ONE DOT
. '([^ ]){2,6}'     // GROUP OF NON-BLANK CHARACTERS (THE TLD)
. '\b'              // THE WORD BOUNDARY
. '#'               // REGEX DELIMITER
. 'i'               // CASE-INSENSITIVE
;

// FIND THE EMAIL
$new = $st1;
$new = str_replace('<', NULL, $new);
$new = str_replace('>', NULL, $new);
var_dump($new);
preg_match($rgx, $new, $mat);

// SHOW THE WORK PRODUCT
var_dump($rgx);
var_dump($mat);

// FIND THE EMAIL
$new = $st2;
$new = str_replace('<', NULL, $new);
$new = str_replace('>', NULL, $new);
var_dump($new);
preg_match($rgx, $new, $mat);

// SHOW THE WORK PRODUCT
var_dump($rgx);
var_dump($mat);

Open in new window

This worked for me..
$remove = array("<",">");
$replace = array("","");
$string = "<email@name.com>";
echo str_replace($remove,$replace,$string);

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of PranjalShah
PranjalShah
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Sorry... Even though the other REGEX worked, this is a better solution.  It puts the string length counts inside the parenthesized groups.
<?php // RAY_temp_nura111.php
error_reporting(E_ALL);
echo "<pre>";

// TEST DATA
$st1 = 'From: <email@name.com>';
$st2 = 'From: email@name.com';

$rgx
= '#'               // REGEX DELIMITER
. '\b'              // WORD BOUNDARY
. '([^ ]*?)'        // GROUP OF NON-BLANK CHARACTERS
. '([@]{1})'        // GROUP OF EXACTLY ONE AT-SIGN
. '(.*?)'           // GROUP OF ANYTHING
. '([.]{1})'        // GROUP OF EXACTLY ONE DOT
. '([^ ]{2,6})'     // GROUP OF NON-BLANK CHARACTERS (THE TLD)
. '\b'              // THE WORD BOUNDARY
. '#'               // REGEX DELIMITER
. 'i'               // CASE-INSENSITIVE
;

// FIND THE EMAIL
$new = $st1;
$new = str_replace('<', NULL, $new);
$new = str_replace('>', NULL, $new);
var_dump($new);
preg_match($rgx, $new, $mat);

// SHOW THE WORK PRODUCT
var_dump($rgx);
var_dump($mat);

// FIND THE EMAIL
$new = $st2;
$new = str_replace('<', NULL, $new);
$new = str_replace('>', NULL, $new);
var_dump($new);
preg_match($rgx, $new, $mat);

// SHOW THE WORK PRODUCT
var_dump($rgx);
var_dump($mat);

Open in new window

or simply:

<?php
$text = "hello my email is this.is@my.email.com. check out my other email too at other@email.net. email me at <hello.world@manyworlds.org>";
$pattern="/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i"; 
preg_match_all($pattern, $text, $matches); 
echo implode('<br />',$matches[0]);
?>

Open in new window

This seems to generate a false positive, accepting an email address for a TLD that does not exist (the longest TLD is "museum").

But that aside, you might find this article interesting.  It shows a similar issue - grabbing domain names - and shows the process that a programmer might use to develop the regular expression, with iterative development and testing.
https://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/A_7830-A-Quick-Tour-of-Test-Driven-Development.html

Best of luck with your project, ~Ray
<?php // RAY_temp_rationalboss.php
error_reporting(E_ALL);

// THE TEST CASE
$text = "hello my email is this.is@my.email.com. check out my other email too at other@email.net. email me at <hello.world@manyworlds.org>";

// AN ADDENDUM TO THE TEST CASE
$text .= '<a href="mailto:ray@gmail.com">email me</a> but not with a bogus@emailaddress.fladderap';

$pattern="/([\s]*)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*([ ]+|)@([ ]+|)([a-zA-Z0-9-]+\.)+([a-zA-Z]{2,}))([\s]*)/i";
preg_match_all($pattern, $text, $matches);
echo implode('<br />',$matches[0]);

Open in new window

Avatar of Nura111

ASKER

I'm already working with a valid email address but its inside the format I mentioned PranjalShah:

its not working and dont I need to remove the from also?
I also posted one if FROM: is part of the string. The code snippet I posted worked for me. Post the code you are trying.
Avatar of Nura111

ASKER

ok got it its was a problem because the string was changing by htmlspecailCars before so it didnt work