如何从字符串中删除所有电子邮件地址和链接,并将其替换为“[已删除]”
答案 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"