如何从 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\.\/%&amp;=\?\-_]+/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() 允许该模式可以作为 stringarray 传递。

$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 中的字符串中删除电子邮件地址和链接?的主要内容,如果未能解决你的问题,请参考以下文章

php中的用户注册:如何删除未完成激活的用户[关闭]

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?

从静态文本自动创建电子邮件链接

如何从PHP和Javascript中的字符串中删除所有空格[重复]

如何从PHP中的内容中删除链接?

如何从长字符串中获取电子邮件地址