2013-10-17 76 views
0

我试图验证对已经在我身上强加以下正则表达式的字符串:PHP非常严格复杂的字符串验证使用的preg_match

[-,.:; 0-9A-Z&@$£¥€'"«»‘’“”?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'"«»‘’“”?!/\\()\[\]{}<>*=#%+]{0,157} 

任何人可以用PHP编写一个preg_match验证输入帮助反对这个字符串?我很努力,因为:

  1. 我正则表达式的知识不是摆在首位的是伟大的
  2. 我看到在正则表达式本身的特殊字符,我觉得肯定PHP不会高兴我直接插入一个字符串(如$£¥€)

在徒劳的希望我刚刚试了一下扎进preg_match,转义双引号,即:

$ste = "Some string input"; 

if(preg_match("/[-,.:; 0-9A-Z&@$£¥€'\"«»‘’“”?!/\\()\[\]{}<>]{3}[-,.:; 0-9A-Z&@$£¥€'\"«»‘’“”?!/\\()\[\]{}<>*=#%+]{0,157}/",$ste)) 
{ 
    echo "OK"; 
} 
else 
{ 
    echo "Not OK"; 
} 

谢谢进阶ANCE!

+0

你已经有了你的正则表达式。那么这是关于什么的? –

+0

所以,你想要一个字符串,可以匹配一个正常表达式,你不知道的功能?为什么? – davidkonrad

+0

你应该启用错误报告,你会注意到你应该在你的正则表达式中转义'/'或者把分隔符替换成'〜'。 – HamZa

回答

1

PHP将与表达式中的“特”字非常开心,只要你做到以下几点:

  1. 确保输入的字符串进行编码,UTF-8编码。

  2. 确保您的PHP程序文件使用UFT-8编码保存。 (显然你也需要在系统的所有其他部分使用UTF-8编码,否则你会得到一些位于线路某处的borked字符,但这不在这个问题的范围之内)但是这不在这个问题的范围之内)

  3. 添加将u修饰符添加到正则表达式模式字符串的末尾,以通知正则表达式解析器处理UTF-8字符。即:

    preg_match("/....../u", ...); 
            ^
           add this 
    

除此之外,你有它已经几乎现货。

+1

我会毁掉情绪,在表达式的某个地方有这样的''“?!/ \\()'。现在注意表达式中的'/',它也被用作分隔符,这意味着它会抛出一个错误'unknown modifier ...'。 – HamZa

+0

谢谢你的非关键答案。欣赏你的时间。这是所有UTF8文件和系统中的编码。我试着在最后添加u,但它仍然没有正确识别模式:( –

+1

@DanielProcter:HamZa确实有一个关于流氓斜线的观点;我错过了(我认为该模式已经完全逃脱了,因为它已经给出了作为一个既成事实,但显然不是)最简单的解决方案是使用不同的分隔符,它不在字符串中,也许在表达式的开始和结尾使用'〜'而不是'/' (或者你可以逃避模式中的'/'字符,但是如果模式已经强加给你,最好不要改变它,如果你可以帮忙的话) – Spudley

1

你可以这样做:

if (preg_match('~^[ -"$&-),-<>?-\]{}£¥€«»‘’“”]{3}[ -\]{}£¥€«»‘’“”]{0,157}$~u', $ste)) 
    echo 'OK'; 
else 
    echo 'Not OK'; 

我已经增加了对Unicode的“u”的修改,并减少使用范围字符类的大小(例如:,-<意味着,<之间的所有字符unicode表)

但最重要的,我加锚^$这意味着respectivly 开始结束的字符串的