问题:作者在CMS中错误地添加了电子邮件地址 - 错过了“mailto:”文本。
我需要一个正则表达式,如果可能的话,在存储的MySQL内容表上进行搜索和替换。
我需要处理的案例有:
示例字符串将是:(为了便于阅读而添加换行符)
<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表达式,那就更好了。
答案 0 :(得分:1)
尝试替换
/href="(?!(mailto:|http:\/\/|www\.))/iU
与
href="mailto:
?!
松散地表示“下一个字符不是这些”。
<强>替代:强>
替换
/(href=")(?!mailto:)([^"]+@)/iU
与
$1mailto:$2
[^"]+
表示一个或多个不是"
的字符。
您可能需要更复杂的匹配模式以保证正确性。
MySQL REGEX匹配:
答案 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:
,然后是第二个捕获组(最后关闭"
)。