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

vaj7vani  于 2023-05-05  发布在  PHP
关注(0)|答案(7)|浏览(164)

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

jm81lzqq

jm81lzqq1#

你可以使用preg_replace来实现。
电子邮件:

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

对于URL:

$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
信用证到期时的信用证:email regex取自preg_match手册页,URL regex取自:http://www.weberdev.com/get_example-4227.html

8xiog9wr

8xiog9wr2#

试试这个:

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

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

2sbarzqh

2sbarzqh3#

我本来要投赞成票的答案被删除了。它链接到Linux Journal的一篇文章Validate an E-Mail Address with PHP, the Right Way,该文章指出了几乎所有人提出的电子邮件正则表达式的问题。
电子邮件地址的有效形式的范围比大多数人想象的要广泛得多。

nimxete2

nimxete24#

我的答案是Josiah的/[^@\s]*@[^@\s]*\.[^@\s]*/的电子邮件的变体,它工作正常,但也匹配电子邮件地址本身之后的任何波动:demo 1
如下修改正则表达式/[^@\s]*@[^@\s\.]*\.[^@\s\.,!?]*/以排除.,!?demo 2

k75qkfdt

k75qkfdt5#

电子邮件模式(10 x to @bromelio)

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

URL的模式

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

lnxxn5zx6#

在电子邮件的第一个本地部分有很多有效字符(参见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?

fd3cxomn

fd3cxomn7#

我的答案是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]";

代码的其他部分保持不变。

相关问题