我有一个关键字列表,例如:
key1
、key2
、key3
、key4
...
我有一个字符串,包括免费字符串和键:值对。我需要确定它有效或无效。规则如下:
key
对中的key:value
应该属于关键字列表。value
对中的key:value
不能为空key:value
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...
。
请帮我看看。
查看示例数据,您想要显示错误的键。在这种情况下,您可以匹配错误的键,如果没有错误的键,则该字符串将是有效的。
错误按键检测模式:
\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 个以上非空白字符,然后匹配 :
示例代码:
$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'
你的正则表达式可以看起来像
^((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)
- 紧邻右侧,必须有一个 :
,后跟一个单词字符。