【问题标题】:PHP and regexp to accept only Greek characters in formPHP 和正则表达式只接受形式中的希腊字符
【发布时间】:2011-06-06 16:49:11
【问题描述】:

我需要一个正则表达式,它只接受我的表单中的名称字段的希腊字符和空格 (PHP)。 我在网上尝试了几个发现,但没有运气。任何帮助将不胜感激。

【问题讨论】:

  • 每当有人试图像那样限制输入范围时,我都会问自己:这真的是个好主意吗?您可能有一个有效的用例,但通常它是矫枉过正的 - 想象一个居住在希腊的非希腊名字的人,或者一个试图在世界其他地方输入临时地址的外国人,等等。
  • 无论哪种方式,您都应该添加更多信息:您要比较的数据是什么字符集? UTF-8?
  • 您尝试了哪些发现? (否则您可能会得到完全相同的建议。)

标签: php regex


【解决方案1】:

全字母解决方案,带重音字母:

/^[A-Za-zΑ-Ωα-ωίϊΐόάέύϋΰήώ]+$/

【讨论】:

  • 除了您的回答之外,我还建议以下内容:/^[A-Za-zΑ-Ωα-ωίϊΐόάέύϋΰήώ]+$/。请注意,我已将第二个范围从 A-z 更改为 a-z
  • 这不会捕捉到其他希腊字母重音。请参阅扩展希腊语 Unicode 块。
  • 这也需要包括Ά, Έ, Ί, Ό, Ύ, Ώ, Ή
【解决方案2】:

我不太了解希腊字母,但如果您想使用罗马字母,您可以这样做:

/^[a-zA-Z\s]*$/

因此,要对希腊语执行此操作,请将 az 替换为希腊字母表的第一个和最后一个字母。如果我没记错的话,它们是αω。所以代码是:

/^[α-ωΑ-Ω\s]*$/

【讨论】:

  • 当希腊字母的修饰语带有符号时?
  • @blackuprise - 那将是一个完全不同的问题。处理变音符号很重要。
  • @JasonCoyne - 尽管i 标志可以解决这个问题,但该答案并未考虑带有变音符号的大写字母。尽管如此,出于几个原因,将它们全部写出来对我来说似乎并不是最好的方法。无论哪种方式,如果您是反对者,请参阅我之前的评论:@blackuprise 的问题是一个不同的用例。这是对@bikey77 问题的书面回答,显然它解决了问题。
【解决方案3】:

这里的其他答案对我不起作用。希腊 Unicode 字符包含在以下两个块中

  • 希腊语和科普特语 U+0370 到 U+03FF(普通希腊字母)
  • 希腊语扩展 U+1F00 到 U+1FFF(带有变音符号的希腊字母)

以下正则表达式匹配整个希腊词:

[\u0370-\u03ff\u1f00-\u1fff]+

我会让读者将其翻译成他们可能使用的任何编程语言格式。

另见

【讨论】:

    【解决方案4】:

    为了详细说明 leo pal 的回答,一个更完整的正则表达式,甚至可以接受带有大写重音的希腊字符,如下所示:

    /^[α-ωΑ-ΩίϊΐόάέύϋΰήώΊΪΌΆΈΎΫΉΏ\s]+$/
    

    有了这个,你得到:

    • α-ω - 小写字母
    • Α-Ω - 大写字母
    • ίϊΐόάέύϋΰήώ - 带有所有(现代)变音符号的小写字母
    • ΊΪΌΆΈΎΫΉΏ - 带有所有(现代)变音符号的大写字母
    • \s - 任何空白字符

    注意:以上内容未考虑古希腊变音符号(ᾶ、ἀ等)。

    【讨论】:

      【解决方案5】:

      对我有用的是/^[a-zA-Z\p{Greek}]+$/u 来源:http://php.net/manual/fr/function.preg-match.php#105324

      【讨论】:

        【解决方案6】:

        utf-8 中的希腊语和科普特语似乎在 U+0370 - U+03FF 范围内。请注意:空格、-. 等不是......

        【讨论】:

          【解决方案7】:

          刚刚在优秀的网站https://regexr.com/ 注意到希腊字符的范围是从“Ά”(902)到“ώ”(974),其中 3 个字符不是单字母字符:“·”(903)并且不可打印字符 0907, 0909 所以[Ά-ώ] 的范围将涵盖 99.99% 的情况!

          (?![·\u0907\u0909])[Ά-ώ] 覆盖 100%。 (虽然我没有在 PHP 上检查这个)

          【讨论】:

            【解决方案8】:

            UTF-8 中的现代希腊字母位于U+0386 - U+03CE range

            所以您需要接受纯希腊字符的正则表达式是:

            $regex_gr = '/^[\x{0386}-\x{03CE}]+$/u';
            

            或(带空格)

            $regex_gr_with_spaces = '/^[\x{0386}-\x{03CE}\s]+$/u';
            

            【讨论】:

            • 看起来这几乎是早期(6 个月前)答案的复制/粘贴......如果早期答案有一些重大改进,最好概述/解释那。谢谢。
            猜你喜欢
            • 2018-05-28
            • 2011-01-30
            • 2016-12-28
            • 2011-08-20
            • 2010-12-19
            • 2020-10-16
            • 1970-01-01
            • 1970-01-01
            • 2013-11-26
            相关资源
            最近更新 更多