正则表达式替换损坏的电子邮件链接

时间:2013-02-13 09:57:41

标签: php regex

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

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

我需要处理的案例有:

  1. 没有'mailto:'
  2. 'mailto:'已包含在内(正确)
  3. 网址不是电子邮件 - 没有替换
  4. 多个mailto:required(字符串中多个)
  5. 示例字符串将是:(为了便于阅读而添加换行符)

    <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表达式,那就更好了。

3 个答案:

答案 0 :(得分:1)

尝试替换

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

href="mailto:

?!松散地表示“下一个字符不是这些”。

<强>替代:

替换

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

$1mailto:$2

[^"]+表示一个或多个不是"的字符。

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

MySQL REGEX匹配:

请参阅thisthis

答案 1 :(得分:1)

您需要首先应用正确的邮件模式(例如:Using a regular expression to validate an email address),在邮件之前搜索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> 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>

答案 2 :(得分:0)

使用以下作为模式:

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

并将其替换为

$1mailto:$2

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

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