PHP验证字符串是英国或美国键盘字符

PHP验证字符串是英国或美国键盘字符,php,string,validation,Php,String,Validation,在PHP中,验证字符串只包含可以使用标准的美国或英国键盘键入的字符(键盘语言设置为UK或US English)是否为真的最简单或最好的方法是什么 更具体地说,我的意思是使用单键按下,同时使用或不使用shift键 我认为角色如下。0123456789ABCDEFGHIjklmnopqrstuvxyzABCDEFGHIjklmnopqrstuvxyz~`!@$%^&*()_-+={[}]|\:;“.?/”和空格您可以通过[-~]覆盖每个ASCII字符(即从空格到波浪线的范围)。然后只需添加就可以了(

在PHP中,验证字符串只包含可以使用标准的美国或英国键盘键入的字符(键盘语言设置为UK或US English)是否为真的最简单或最好的方法是什么

更具体地说,我的意思是使用单键按下,同时使用或不使用shift键


我认为角色如下。0123456789ABCDEFGHIjklmnopqrstuvxyzABCDEFGHIjklmnopqrstuvxyz~`!@$%^&*()_-+={[}]|\:;“.?/”和空格

您可以通过
[-~]
覆盖每个ASCII字符(即从空格到波浪线的范围)。然后只需添加
就可以了(您可能还需要添加其他字符,如
±
§
,但要了解这一点,请查看美国和英国的键盘布局)

比如:

if(preg_match('#^[ -~£±§]*$#', $string)) {
    // valid
}

以下正则表达式可能对您有用:

/^([a-zA-Z0-9!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~\t ])*$/m
/^([a-zA-Z0-9!”$%&'()*+,\-.\/:;?@[\\]^{124;}~\ t])*$/m
将其用作:

$result = (bool)preg_match('/^([a-zA-Z0-9!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~\t ])*$/m', $input);
$result=(bool)preg\u match('/^([a-zA-Z0-9!'$%&\'()*+,\-.\/:;?@[\\\]^{124;}~\ t])*$/m',$input);
或者根据以下代码创建可重用函数:

function testUsUkKeyboard($input) 
{
    return (bool)preg_match('/^([a-zA-Z0-9!"#$%&\'()*+,\-.\/:;<=>?@[\\\]^_`{|}~\t ])*$/m', $input);
}
功能测试UsukKeyboard($input)
{
返回(bool)preg\u match('/^([a-zA-Z0-9!'$%&'()*+,\-.\/:;?@[\\]^.`{124;}~\ t])*$/m',$input);
}

更简单的检查方法是检查字符是否存在,而不是它们是否存在,因此首先您需要一个不存在的字符列表,您可以从ascii范围128-255中获取这些字符,其中0-127是常规密钥集

Tio创建无效数组uou可以执行以下操作:

$chars = range(128,255);
上述数组将包含下表中的所有字符:

然后你应该再次检查有问题的字符串,人们说使用正则表达式,但我真的不认为这是必要的

$string=“测试普通字符串”


对于($s=0;$salso),您可能想添加
/[\x80-\xFF]/
匹配非ascii码chars@RobertPitt:好的,OP只需要只提供按键或按键+shift键的字符。我认为
[\x80-\xFF]
涵盖的内容要多得多。这并没有给我预期的结果。我正在做$string=file\u get\u contents($url);其中包含我论坛上一篇帖子的html,但如果(preg#u match(“#^[-~±§]*$#,$string])的结果表明,当我将其导出时,它不是UK/US。在第二个文件中,获取包含以下内容的帖子的内容($url)相关的主题文章:如果(preg_match(“#^[-~±§]*$#,$string))也说我想要的不是UK/US,但鉴于第一个也返回了非UK/US,那么我的测试没有正常工作。@Colin Hill:第一个的inout是什么?我从来没有说过正则表达式是完整的,可能缺少字符(例如,您没有提到tab或return等不可打印字符(然后您必须添加
\s
)。现在,您已经在非html字符串上测试了此解决方案,并且效果良好。每个人都选择了pcre:/必须有其他一些方法。但是
±
(241)是美国键盘布局的一部分,并且
(156)是的,就像你的一样,你必须添加特定的字符,在我的键盘上,你可以从数组中删除特定的字符。同样的输出。我的键盘没有±,而我在美国。@Brad:嗯,那么Mac OS X中的美国键盘布局就在那里。键盘查看器在
1
±
旁边显示我的
§
当我按下shift键时。很奇怪。可能是Mac的问题。是的,有很多不同的键盘布局。我希望我有我的旧IBM PS/2键盘。它会上升到F16.:-D这并没有给我预期的结果。请参阅下面我对Felix的评论回答,但基本上是相同的结果,除了当测试1应该为真时两个测试都返回false和tesT2应该是假的。Felix的评论是有效的,你没有提到不可打印的字符。你可以用'm'开关启用多行,用\t来制表符。像这样:/^([a-zA-Z0-9!'$%&'()*+,\-.\/:;?@[\]^{124;}-\ t])*$/m相应地编辑了我的帖子。我没有提到这一点是因为我做了$string=file\u获取内容($url)$string=str u替换(“\r\n”“,$string);$string=str_replace(“\t”,”,$string);$string=str_replace(chr(9),“”,$string);$string=str_replace(chr(10),“”,$string);$string=str_replace(chr(13),“”,$string)@Colin Hill:那么,您测试的内容中有哪些内容无效?如果我们知道可以改进我们的答案的话。您能否确定文件内容($url)的结果中有哪些字符与正则表达式不匹配?这可能有助于解决问题。
for($s=0;$s<strlen($string);$s++)
{
    if(in_array(ord($string[$s]),$chars))
    {
        //Invalid
    }
}