PHP 正则表达式键:值验证

问题描述 投票:0回答:2

我有一个关键字列表,例如:

key1
key2
key3
key4
...

我有一个字符串,包括免费字符串和键:值对。我需要确定它有效或无效。规则如下:

  1. 如果字符串 NOT 包含关键字 => VALID
  2. key
    对中的
    key:value
    应该属于关键字列表。
  3. value
    对中的
    key:value
    不能为空
  4. 冒号前后没有空格成对
    key:value
  5. 不要接受任何不在关键字列表中的
    key:value

示例:

  • aaa bbb ccc
    => 有效
  • aaa bbb key1:aaa ccc ddd
    => 有效
  • aaa bbb key2:aaa key1:bbb
    => 有效
  • aaa bbb key1 ccc
    => 无效
    key1
    不遵守规则
    key:value
  • aaa bbb key1:xxx key2:
    => 无效
    key2
    不遵守规则
    key:value
  • aaa bbb key1:  xxx ccc
    => INVALID(冒号后不接受空格)
  • aaa bbb key1  :xxx ccc
    => INVALID(冒号前不接受空格)
  • aaa bbb aakey1
    => VALID
    aakey1
    不是关键字)
  • aaa bbb key1aa
    => VALID
    key1aa
    不是关键字)
  • aaa bbb xxx:yyy zzz
    => INVALID(不接受任何
    key:value
    ,该
    key
    不在关键字列表中)

我已经尝试过

/^(?: ?(?:\b(?:key1|key2)(?:: *\S+|(*SKIP)(*FAIL))|\[^: \]+))*$/
。很好,但没有覆盖案例
aaa bbb key1aa
。它变得无效而不是有效。

另外,如何获取无效关键字?因为我需要向前端显示错误消息。

示例:对于

aaa bbb key1 ccc
,我需要在这里取错误键是
key1
。这样,我就可以向前端显示错误消息,例如:
Key1 is invalid format, please check it again...

请帮我看看。

php regex validation text-parsing
2个回答
1
投票

查看示例数据,您想要显示错误的键。在这种情况下,您可以匹配错误的键,如果没有错误的键,则该字符串将是有效的。

错误按键检测模式:

\b(?:key1|key2)\b:?(?:\h+|$)|\b(?!(?:key1|key2)\b)[^\s:]+:

解释

  • \b(?:key1|key2)\b
    在单词边界之间匹配 key1 或 key2
  • :?(?:\h+|$)
    匹配可选的
    :
    和 1 个以上空格或字符串结尾
  • |
    或者
  • \b
    单词边界
  • (?!(?:key1|key2)\b)
    负向前瞻,断言右侧不是 key1 或 key2
  • [^\s:]+:
    匹配除
    :
    之外的 1 个以上非空白字符,然后匹配
    :

正则表达式演示 | PHP 演示

示例代码:

$keywords = ["key1", "key2"];
$escaped = implode('|', array_map('preg_quote', $keywords));
$pattern = "/\b(?:" . $escaped . ")\b" . ":?(?:\h+|$)|\b(?!(?:" . $escaped . ")\b)[^\s:]+:/";

$strings = [
    "aaa bbb key1 ccc",
    "aaa bbb key1:xxx key2:",
    "aaa bbb key1:  xxx ccc",
    "aaa bbb key1  :xxx ccc",
    "aaa bbb xxx:yyy zzz",
    "aaa bbb ccc",
    "aaa bbb key1:aaa ccc ddd",
    "aaa bbb key2:aaa key1:bbb",
    "aaa bbb aakey1",
    "aaa bbb key1aa",
    "aaa bbb key1aa"
];

foreach ($strings as $s) {
    preg_match_all($pattern, $s, $matches);
    if (count($matches[0]) > 0) {
        foreach ($matches[0] as $m) {
            echo "Invalid string -->'$m' is invalid format, please check it again..." . PHP_EOL;
        }
    } else {
        echo "Valid string --> '$s'" . PHP_EOL;
    }
}

输出

Invalid string -->'key1 ' is invalid format, please check it again...
Invalid string -->'key2:' is invalid format, please check it again...
Invalid string -->'key1:  ' is invalid format, please check it again...
Invalid string -->'key1  ' is invalid format, please check it again...
Invalid string -->'xxx:' is invalid format, please check it again...
Valid string --> 'aaa bbb ccc'
Valid string --> 'aaa bbb key1:aaa ccc ddd'
Valid string --> 'aaa bbb key2:aaa key1:bbb'
Valid string --> 'aaa bbb aakey1'
Valid string --> 'aaa bbb key1aa'
Valid string --> 'aaa bbb key1aa'

1
投票

你的正则表达式可以看起来像

^((key1|key2|key3):\w+|\b(?!(?2)\b)\w+)(?:\h+(?1))*$
^((key1|key2|key3):\w+|(?!(?2)\b)\w+)(?:\s+(?1))*$

请参阅正则表达式演示详情

  • ^
    - 字符串的开头
  • ((key1|key2|key3):\w+|(?!(?2)\b)\w+)
    - 第 1 组:
    • (key1|key2|key3):\w+
      - 第 1 组中捕获的有效键的单词,
      :
      ,一个或多个单词字符
    • |
      - 或
    • (?!(?2)\b)\w+
      - 不是键的单词
  • (?:\h+(?1))*
    - 零次或多次重复
    • \h+
      - 一个或多个水平空格
    • (?1)
      - 第 1 组模式递归/重复
  • $
    - 字符串结尾

要收集不在您列表中的钥匙,您可以使用

\b(?!(?:key1|key2|key3):)\w+(?=:\b)

请参阅此正则表达式演示详情

  • \b
    - 单词边界
  • (?!(?:key1|key2):)
    - 如果有
    key1
    key2
    (等)后跟
    :
  • ,则会导致匹配失败
  • \w+
    - 一个或多个单词字符
  • (?=:\b)
    - 紧邻右侧,必须有一个
    :
    ,后跟一个单词字符。
© www.soinside.com 2019 - 2024. All rights reserved.