如何使用有条件允许的字符串验证输入字符串?

时间:2017-06-07 22:12:10

标签: php regex validation preg-match

我想阻止在用户名中使用某些单词,除非它们是允许字符串的子字符串。

不允许使用lovehugkiss字词,除非在mylovelygivehugkissing中使用这些字词。

我从这种模式开始,但它不起作用:

preg_match('[love|hug|kiss]', $data)

这些是具有所需输出的一些输入:

  • boolove(无效 - "爱"找到,但不是" mylovely")
  • mylovely(有效 - "爱"包含在" mylovely")
  • givehug(有效 - "拥抱"包含在" givehug")
  • igivehug(有效 - "拥抱"包含在" givehug")
  • 接吻(有效 - "吻"包含在"接吻")
  • youhug(无效 - "拥抱"找到,但不是" givehug")
  • ikiss(无效 - "亲吻"发现,但不是"亲吻")
  • 巴斯特(有效 - 不包含爱,拥抱或亲吻)

如何实现此验证以返回true | false响应?

1 个答案:

答案 0 :(得分:0)

当存在两个$flag值时,我的非正则表达式方法存在潜在的缺陷,但存在一个$forgive值,所以我希望提供一个使用带有lookbehinds和lookaheads的模式的正则表达式方法识别无效字符串:

代码(PHP DemoPattern Demo):

$inputs=['love','mickmackusa','kisses','mylovely','give','hug','givehug','kiss','kissing'];
foreach($inputs as $input){
    echo "\n$input ";
    var_export(preg_match('/kiss(?!ing)|(?<!give)hug|(?<!my)love(?!ly)/i',$input)==1?false:true);
}

输出:

love false
mickmackusa true
kisses false
mylovely true
give true
hug false
givehug true
kiss false
kissing true

旧的非正则表达式方法......

输入:

$input='code'; // mylovely(true) , give(false) , code(true)
$checks=['love'=>'mylovely','give'=>'givehug','kiss'=>'kissing'];

方法(无正则表达式):

$result=true;
foreach($checks as $flag=>$forgive){
    if(stripos($input,$flag)!==false && stripos($input,$forgive)===false){
        $result=false;  // unforgivable word included
        break;
    }
}
var_export($result);

输出:

true

说明:

  • $checks数组包含表示可能无效的单词的键,以及在$input值中匹配键时允许的值。
  • 迭代了3个$check元素,stripos()用于不区分大小写地检查输入有效性。
  • 为了提高效率,只要$input被视为无效,循环就会被破坏。