使用 PHP 使用包含电子邮件地址的查询字符串验证 url

Validate url with query string containing email address using PHP

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

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

这封电子邮件是正确的 john+test1@example.comjohn@example.com

的别名

我有这样的正则表达式:

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

但它没有像我预期的那样工作,因为它将 + 替换为空字符串,这是错误的。它应该保留此 + 作为电子邮件地址的别名,并应在保持地址正确性的同时删除特殊字符。

错误 url 与 + 的示例:

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

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

知道如何解决吗?

我想这就是你要找的:

<?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 上有 #,此解决方案将不起作用,如果是这样,您将需要使用另一个字符而不是 # 进行临时替换。