找出允许的字符或字符串的存在

时间:2016-05-02 13:36:30

标签: php preg-match pcre regex-negation

好吧,我被卡住了,我找不到正确的格式来让RegEx提供给PHP preg_match。

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

我有一个允许的字符和字符串的字典。

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

目标

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

因此"mdo"的情况不匹配,因为m被允许就像字符串do一样。 o不一样,o不是允许的char,而且不包含整个允许的字符串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”?他们的立场并不重要。

1 个答案:

答案 0 :(得分: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);

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