【问题标题】:Validate url with query string containing email address using PHP使用 PHP 使用包含电子邮件地址的查询字符串验证 url
【发布时间】:2019-02-19 05:03:25
【问题描述】:

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

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

这封电子邮件是正确的,其中john+test1@example.comjohn@example.com 的别名

我有这样的正则表达式:

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

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

+ 的错误网址示例:

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

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

知道如何解决吗?

【问题讨论】:

  • 我建议您使用regexr.com 进行测试,它可能非常有用
  • 为什么需要将电子邮件作为 GET 参数传递?你不能以不同的方式构建你的逻辑吗?
  • 您应该 urlencode() 在 URL 中作为查询参数发送的任何值。否则,浏览器将解释特殊字符(如+ 是空格的替代品)。浏览器无法知道您需要文字加号。另外,为什么要将查询字符串作为 URL 的一部分进行验证?你能解释一下那个“验证”到底是干什么用的吗?
  • 试试preg_replace('~[\0\s]+|\++(?=.*\?)|(\?.*)~', '$1', $s)
  • 这是一段旧代码,其中函数 x 使用此 url 设置 header() 以将用户重定向到带有查询字符串中的电子邮件地址的自定义 url,并且用户可以使用 + 设置他的电子邮件,它使一个问题

标签: php regex url email-validation url-validation


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

【讨论】:

  • 如果您从此处删除 @:返回 $matches[1] 。 preg_replace('/\+(?!$)/i', '#', $matches[3]) 。 '@';这将是完美的
猜你喜欢
  • 2013-05-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2021-10-20
相关资源
最近更新 更多