【问题标题】:Recognize unicode symbol domains in text识别文本中的 unicode 符号域
【发布时间】:2019-06-12 12:43:00
【问题描述】:

我有以下正则表达式

(?!:\/\/)([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\.[a-zA-Z]{2,11}?$

它可以识别 moo.foo 之类的域,但无法识别以下情况:

  • festelån.net 有一些 unicode 字符
  • http://hellöthere.com/ 或存在 httphttps 协议以及 slashes 的情况。

如何修改它以识别这些情况? 我不擅长正则表达式感谢您的帮助。
如果你想玩,这里是 online real time 示例的编辑。

【问题讨论】:

  • (?!:\/\/) 表示与封闭的字符不匹配,这意味着:// 不会成为捕获的一部分,this alone should not break the regex。最后一个示例不匹配(除了 unicode)的原因是,以 $ 结尾的正则表达式意味着它必须位于字符串的末尾,这意味着尾随的 / 阻止了匹配。 [\p{L}\p{N}] 可以用来代替 [a-z0-9] 以匹配任何 unicode 字母或数字(\p{L} 是任何字母,\p{N} 是任何数字)
  • 10x 用于解释@SamRockett。在您的示例中,此模式 (?!:\/\/)([\p{L}\p{N}\-_]+\.)*[\p{L}\p{N}\][\p{L}\p{N}\-_]+\.[a-zA-Z]{2,11}} 捕获了我正在寻找的内容,但在使用 preg_match 的 php 中却没有。虽然应该还是PCRE

标签: php regex string search pcre


【解决方案1】:

这是我的 OpenSource 项目中的一个功能,可能会对您有所帮助。我已经使用 PHP filtar_var 函数来应用验证。

public function ValidateHost($Host)
    {
        if(isset($Host))
        {
            if(!is_null($Host) && !empty($Host))
            {
                if(strstr($Host, ".") && strlen($Host) > 3 && strlen($Host) < 255 && (!strstr($Host, "..")) && (!strstr($Host, " "))
                   && preg_match('/[a-zA-Z]+/', $Host) && (!strstr($Host, "@")) &&
                   !(preg_match('/([^.]*[.][0-9]*$)/', $Host)) && filter_var(FILTER_VALIDATE_URL) == true)
                    return Config::RET_OK;
                else return Config::INVALID_HOST_NAME;
            }
            else return Config::INVALID_NULL;
        }
        else return Config::INVALID_NULL;
    }

如果您想查看,这是我的项目:InfraTools

【讨论】:

  • 能否解释一下您在这里做什么以及为什么有效?只是我看到问题中的代码发生了很多变化,我无法弄清楚为什么要进行这些更改,或者这将如何解决 unicode 字符的问题。
  • @SamRockett 我给出的函数是一个验证给定主机名的通用函数。 Config::INVALID 是常量,可以替换为 return false 和 true。有几个验证一起,但如果帖子是 FILTER_VALIDATE_URL,那么一个更有趣的原因。但是在我的旧测试中,我一起完成了这些其他验证,这使得该功能按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多