如何从PHP中的字符串中删除电子邮件地址和链接?

时间:2010-07-21 19:45:48

标签: php string email hyperlink

如何从字符串中删除所有电子邮件地址和链接,并将其替换为“[已删除]”

6 个答案:

答案 0 :(得分:16)

您可以使用preg_replace来执行此操作。

电子邮件:

$pattern = "/[^@\s]*@[^@\s]*\.[^@\s]*/";
$replacement = "[removed]";
preg_replace($pattern, $replacement, $string);

表示网址:

$pattern = "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i";
$replacement = "[removed]";
preg_replace($pattern, $replacement, $string);

<强>资源

PHP手册输入:http://php.net/manual/en/function.preg-replace.php

信用到期的信用:从preg_match联机帮助页获取的电子邮件正则表达式,以及从http://www.weberdev.com/get_example-4227.html获取的URL正则表达式

答案 1 :(得分:2)

试试这个:

$patterns = array('<[\w.]+@[\w.]+>', '<\w{3,6}:(?:(?://)|(?:\\\\))[^\s]+>');
$matches = array('[email removed]', '[link removed]');
$newString = preg_replace($patterns, $matches, $stringToBeMatched);

注意:您可以将一组模式和匹配传递给preg_replace,而不是运行两次。

答案 2 :(得分:1)

我要回复的答案已被删除。它链接到Linux Journal文章Validate an E-Mail Address with PHP, the Right Way,指出几乎每个人提出的所有电子邮件正则表达式都有问题。

电子邮件地址的有效格式范围比大多数人想象的要广泛得多。

答案 3 :(得分:0)

我的答案是Josiah的/[^@\s]*@[^@\s]*\.[^@\s]*/电子邮件的变体,其效果很好,但也匹配电子邮件地址后的任何标点符号:demo 1

根据以下/[^@\s]*@[^@\s\.]*\.[^@\s\.,!?]*/调整正则表达式,以排除. , !?demo 2

答案 4 :(得分:0)

电子邮件的第一个本地部分中有很多有效字符(请参见What characters are allowed in an email address?),因此这些行将替换所有有效的电子邮件地址:

<?php
$c='a-zA-Z-_0-9'; // allowed characters in domainpart
$la=preg_quote('!#$%&\'*+-/=?^_`{|}~', "/"); // additional allowed in first localpart
$email="[$c$la][$c$la\.]*[^.]@[$c]+\.[$c]+";
$t = preg_replace("/\b($email)\b/", '[removed]', $t);
// or with a link:
$t = preg_replace("/\b($email)\b/", '<a href="mailto:\1">\1</a>', $t);

# replace urls:
a='A-Za-z0-9\-_';
$t = preg_replace("/[htpsftp]+[:\/\/]+[$a]+\.+[$a\.\/%&=\?]+/i", '[removed]', $t);

这将涵盖大多数有效的电子邮件地址,并告知:仅真正删除所有有效的电子邮件地址会有点复杂(请参见How to validate an email address using a regular expression?

答案 5 :(得分:0)

电子邮件模式(10 倍到 @bromelio)

"/[^@\s]*@[^@\s\.]*\.[^@\s\.,!?]*/"

网址格式

"#((?:https?|ftp)://\S+[[:alnum:]]/?)#si"