从允许的字符或字符串中查找字符或字符串的存在

Finding presence of chars or strings out of the allowed ones

好吧,我被卡住了,我找不到正则表达式提供给 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"?他们的位置无关紧要。

你可以使用这个模式:

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);

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