【问题标题】:Check if php string only contains characters from an european language检查php字符串是否仅包含来自欧洲语言的字符
【发布时间】:2020-05-27 23:08:23
【问题描述】:

我想检查一个字符串是否只包含欧洲常见的字符、数字和特殊字符。我找到了How to check, if a php string contains only english letters and digits? 之类的答案,但这不包括法语 é 和 è 或德语 äöüß 或罗马尼亚语 ă。我还希望允许经常使用特殊字符,例如 €, !"§$%&/()=#|

有人有一套完整的包含所有这些字符的集合来检查它吗?

【问题讨论】:

  • 您在问什么,还有哪些其他字符要添加到您的“经常使用[d] 特殊字符”列表中?好吧,这取决于你,不是吗?我们不知道您想要限制什么以及为什么
  • 对。这是一家为整个欧盟提供订购服务的在线商店。他们经常收到难以翻译的西里尔文或中文在线形式的消息,应该得到这样的消息:请使用另一种语言。但例如应该允许使用法语名称“René”,例如 € 或 % 或 !这可能发生在有效请求中。所以也许其他人可能有这样一个字符列表可以放入这样的列表中进行检查。
  • 是否需要允许所有你提到的字符包括英文?

标签: php regex localization


【解决方案1】:

您可以使用\p{Latin} 测试拉丁字符,确保使用u 正则表达式标志:

<?php
$tests = [
    'éèäöüßäöüßäöüßäöü',
    'abcdeABCDE',
    '€, !"§$%&/()=#|<>',
    'ÄäAa',
    '*',
    'Здравствуйте'
];

foreach ($tests as $test) {
    if (!preg_match('/[^\p{Latin}0-9€, !"§$%&\/()=#|<>]/u', $test)) {
        echo "$test is okay\n";
    }
}

打印:

éèäöüßäöüßäöüßäöü is okay
abcdeABCDE is okay
€, !"§$%&/()=#|<> is okay
ÄäAa is okay

【讨论】:

    【解决方案2】:

    我认为你可以使用正则表达式

    $re = '/[A-Za-z0-9]*/m';
    $str = 'человек';
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    var_dump($matches);
    

    【讨论】:

      【解决方案3】:

      不在 a-z 和 A-Z 中的字符是:

      [^a-zA-Z]

      所以你可以使用类似的东西:

      Regex_CountMatches([String_Field],"[^a-zA-Z]")

      因为这个函数有一个大小写选项(默认值 1 不区分大小写),所以只搜索 [^a-z] 也可以。

      【讨论】:

      • 感谢您的回复。问题是, a-zA_z 不包含像 éèäöü 这样的字符,这也应该是有效的。我的问题不是把它变成一个正则表达式,而是得到一个“尽可能完整”的可能我有效的字符列表。
      • 这是匹配任何非拉丁字母的字符。
      猜你喜欢
      • 1970-01-01
      • 2010-12-19
      • 2012-06-23
      • 2014-05-07
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2015-03-15
      相关资源
      最近更新 更多