如何从 PHP 中的字符串中删除电子邮件地址和链接?
Posted
技术标签:
【中文标题】如何从 PHP 中的字符串中删除电子邮件地址和链接?【英文标题】:How to remove email addresses and links from a string in PHP? 【发布时间】:2011-03-19 04:57:26 【问题描述】:如何从字符串中删除所有电子邮件地址和链接并将其替换为“[removed]”
【问题讨论】:
【参考方案1】:你可以使用 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 手册页,URL 正则表达式取自:http://www.weberdev.com/get_example-4227.html
【讨论】:
你能张贴一小段文字吗? 这只是我的一个随机文本。没什么特别的,只是一些电子邮件地址和一些链接 这不对。电子邮件的正则表达式不会删除有效电子邮件地址中不允许的 :?#$% 之类的标点符号。正则表达式必须删除除字母数字和句点 (.) 之外的所有字符。其他所有内容(也可能允许使用其他一些字符,但不是全部!)。 感谢它的工作。你能建议模式来删除 10 位数的手机号码吗 无法正常工作。需要改进。【参考方案2】:试试这个:
$patterns = array('<[\w.]+@[\w.]+>', '<\w3,6:(?:(?://)|(?:\\\\))[^\s]+>');
$matches = array('[email removed]', '[link removed]');
$newString = preg_replace($patterns, $matches, $stringToBeMatched);
注意:您可以将一组模式和匹配项传递到 preg_replace 中,而不是运行两次。
【讨论】:
www.site.com 不是链接。你也想删除 URL 吗? 是的,它不会删除 www.site.com :-( 要删除 www.site.com 我们可以使用模式$pattern = "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i";
清理preg_replace('!\s*\.\s*!', '.', 'visit today *** . com and enjoy.');
也很有用【参考方案3】:
我要投票的答案已被删除。它链接到 Linux Journal 文章 Validate an E-Mail Address with PHP, the Right Way,该文章指出了几乎每个人提出的电子邮件正则表达式都有什么问题。
电子邮件地址的有效形式范围比大多数人想象的要广泛得多。
【讨论】:
【参考方案4】:我的答案是 Josiah 的电子邮件/[^@\s]*@[^@\s]*\.[^@\s]*/
的变体,它工作正常,但也匹配电子邮件地址本身之后的任何波动:demo 1
如下调整正则表达式 /[^@\s]*@[^@\s\.]*\.[^@\s\.,!?]*/
以排除 .
,
!
和 ?
: demo 2
【讨论】:
【参考方案5】:电子邮件的第一本地部分有很多有效字符(请参阅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 can I validate an email address using a regular expression?)
【讨论】:
【参考方案6】:电子邮件模式(@bromelio 的 10 倍)
"/[^@\s]*@[^@\s\.]*\.[^@\s\.,!?]*/"
网址模式
"#((?:https?|ftp)://\S+[[:alnum:]]/?)#si"
【讨论】:
【参考方案7】:我的回答是对Josiah's code
略有改进。只想将两个代码段合并为一个,因为 preg_replace()
允许该模式可以作为 string
或 array
传递。
$patterns = array();
$patterns[0] = "/[^@\s]*@[^@\s]*\.[^@\s]*/"; //removes email
$patterns[1] = "/[a-zA-Z]*[:\/\/]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-
_]+/i"; //removes any link
$replace = "[removed]";
$string = "Follow the link below https://stackoverlow.com/testing/preg-
match-replace-in-php or email me a sample code in my email
test@mail.com";
preg_replace($pattern,s $replacement, $string);
如果您想在删除链接或电子邮件时使用不同的替换文本,例如在删除邮件时指定[email has been removed]
和[link has been removed]
,您可以扩展以上代码段等等$replacement
如下图
$replacements = array();
//replacementmessage for mails
$replacements[0] = "[Email has been removed]";
//replacementmessage for links
$replacements[1] = "[Link has been removed]";
并且代码的所有其他部分都保持不变。
【讨论】:
以上是关于如何从 PHP 中的字符串中删除电子邮件地址和链接?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?