0

问题:作者在 CMS 中错误地添加了电子邮件地址 - 遗漏了“mailto:”文本。

如果可能的话,我需要一个正则表达式来对存储的 MySQL 内容表进行搜索和替换。

我需要处理的情况是:

  1. 没有'mailto:'
  2. 'mailto:' 已包含(正确)
  3. 网址不是电子邮件 - 不可替换
  4. 多个mailto:必需(字符串中的多个)

示例字符串为:(添加换行符以提高可读性)

<a href="add1@test.com">add1@test.com</a> and
<a href="mailto:add2@test.com">add2@test.com</a> and
<a href="http://www.test.com/">real web link</a>
second one to replace <a href="add3@test.com">add3@test.com</a>

所需的输出将是:

<a href="mailto:add1@test.com">add1@test.com</a> and
<a href="mailto:add2@test.com">add2@test.com</a> and
<a href="http://www.test.com/">real web link</a>
second one to replace <a href="mailto:add3@test.com">add3@test.com</a>

我尝试过的(在 PHP 中)和问题:

pattern:   /href="(.+?)(@)(.+?)(<\/a> )/iU
replacement:    href="mailto:$1$2$3$4

这是将 mailto: 添加到正确格式的 mailto: 并在最后两个链接上贪婪地行事。

谢谢你的帮助。我已经看了看,但是因为这是一个意外的内容问题,所以没有时间了。

如果您能节省我的时间并给出 SQL 表达式,那就更好了。

4

3 回答 3

1

您需要首先应用适当的邮件模式(例如:使用正则表达式来验证电子邮件地址),然后在邮件之前搜索 mailto:或什么都不做(例如:) (mailto:|),最后preg_replace_callback适合这个。

这看起来像您希望的那样工作(仅搜索双引号中的电子邮件地址);

$s = '<a href="add1@test.com">add1@test.com</a> and 
<a href="mailto:add2@test.com">add2@test.com</a> and 
<a href="http://www.test.com/">real web link</a> 
second one to replace <a href="add3@test.com">add3@test.com</a>';
echo preg_replace_callback(
    '~"(mailto:|)([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4}))"~i', 
    function($m) {
        // print_r($m); @debug
        return '"mailto:'. $m[2] .'"';
    },
    $s
);

根据需要输出;

<a href="mailto:add1@test.com">add1@test.com</a> 和
<a href="mailto:add2@test.com">add2@test.com</a> 和
<a href="http://www.test.com/">真实网页链接</a>
第二个替换 <a href="mailto:add3@test.com">add3@test.com</a>
于 2013-02-13T10:46:06.303 回答
1

尝试更换

/href="(?!(mailto:|http:\/\/|www\.))/iU

href="mailto:

?!松散的意思是“下一个字符不是这些”。

选择:

代替

/(href=")(?!mailto:)([^"]+@)/iU

$1mailto:$2

[^"]+表示 1 个或多个不是".

您可能需要更复杂的匹配模式来保证正确性。

MySQL 正则表达式匹配:

这个这个

于 2013-02-13T10:29:08.750 回答
0

使用以下作为模式:

/(href=")(?!mailto:)(.+?@.+?")/iU

并将其替换为

$1mailto:$2

(?!mailto:)mailto:是检查 a 是否跟随的负前瞻。如果没有这样的,则检查剩余部分是否匹配。(.+?@.+?")匹配一个或多个字符后跟 a@后跟一个或多个字符后跟 a "。两者+都不贪心。

匹配的模式被第一个捕获组 ( href=")替换,mailto:然后是第二个捕获组(直到关闭")。

于 2013-02-13T10:28:39.480 回答