0

嗨,我在使用包含电子邮件地址的查询字符串进行正确的 url 验证时遇到问题,例如:

https://example.com/?email=john+test1@example.com

这封电子邮件是正确的一个john+test1@example.com是别名john@example.com

我有这样的正则表达式:

$page = trim(preg_replace('/[\\0\\s+]/', '', $page));

但它不像我预期的那样工作,因为它替换+为空字符串出了什么问题。它应将此保留+为电子邮件地址的别名,并应在保持地址正确性的同时删除特殊字符。

错误网址示例+

https://examp+le.com/?email=example@exam+ple.com

查询字符串中没有电子邮件的其他 url 应使用此正则表达式正确验证

知道如何解决吗?

4

1 回答 1

1

我想这就是你要找的:

<?php

function replace_plus_sign($string){
    return
    preg_replace(
        '/#/',
        '+',
        preg_replace(
            '/\++/i',
            '',
            preg_replace_callback(
                '/(email([\d]+)?=)([^@]+)/i',
                function($matches){
                    return $matches[1] . preg_replace('/\+(?!$)/i', '#', $matches[3]);
                },
                $string
            )
        )
    );
}

$page = 'https://exam+ple.com/email=john+test1+@example.com&email2=john+test2@exam+ple.com';
echo replace_plus_sign($page);

给出以下输出:

https://example.com/email=john+test1@example.com&email2=john+test2@example.com

起初,我用 替换了有效+的电子邮件地址签名#,然后删除了所有剩余的+,之后,我用 替换#+

如果 URL 上有 s,则此解决方案将不起作用,#如果您需要使用另一个字符而不是#临时替换,则此解决方案将不起作用。

于 2018-09-14T13:26:28.170 回答