【问题标题】:Finding presence of chars or strings out of the allowed ones从允许的字符或字符串中查找字符或字符串的存在
【发布时间】:2016-05-02 13:36:29
【问题描述】:

好吧,我卡住了,我找不到正则表达式提供给 PHP preg_match 的正确格式。

我有两个字符串。说"mdo" 和"o",但它们可能是随机的。

我有一本允许使用的字符和字符串的字典。

例如,允许的字符为"a-gm0-9",允许的字符串为"do" 和"si"。

目标

我正在尝试检查输入字符串不包含任何字符或字符串,但不包含字典中的字符或字符串,不区分大小写。

所以"mdo" 的大小写不匹配,因为m 像字符串do 一样被允许。与 o 不同,它的 o 不是允许的字符并且不包含整个允许的字符串 do。

我挣扎的理由

可以否定[^a-gm0-9] 和(?!do|si),但我无法实现的是把它们放在一个正则表达式中以便应用以下PHP 代码:

<?php
  $inputStr = 'mdo';
  $rex = '/?????/i';      // the question subject
  // if disallowed chars/strings are found...
  if( preg_match($regex, $inputStr) == 1 )
    return false;     // the $inputStr is not valid
  return true;
?>

因为两个级联 preg_matches 会破坏逻辑并且不起作用。

如何在单个正则表达式中混合使用“AND”中的字符检查和组检查?他们的位置无关紧要。

【问题讨论】:

  • 检查允许的字符和子字符串以及在 if 条件中否定 preg_match 函数本身更简单。
  • 主要问题(我认为)是“do”和“si”都包含不允许的字符......

标签: php preg-match pcre regex-negation


【解决方案1】:

你可以使用这个模式:

return (bool) preg_match('~^(?:do|si|[a-gm0-9])*+\C~i', $inputStr);

这个想法是用possessive quantifier 匹配重复组中所有允许的字符和子字符串,并检查是否保留单个字节\C。由于量词是贪婪和占有欲的,所以后面的单字节,如果找到,就不能被允许。

注意大多数时候,取反preg_match函数比较简单,例子:

return (bool) !preg_match('~^(?:do|si|[a-gm0-9])*$~iD', $inputStr);

(或使用 + 量词,如果您不想允许空字符串)

【讨论】:

  • 我对你们可以以这种方式处理正则表达式的人表示无限的敬意……就像巫师之类的东西。这两个版本都很好用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
相关资源
最近更新 更多