我希望能够验证下面的字符串,以便在反引号之间允许数据无限次,只要它后跟逗号,如果它不是逗号必须是“)”。只允许空格不在其中的反引号中。
我对正则表达式没有经验,所以我不知道如何允许重复模式。以下是我目前的模式。
由于
已更新
// first 3 lines should match
$lines[] = "(`a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`)";
$lines[] = "( `a-z0-9_-`, `a-z0-9_-` ,`a-z0-9_-` , `a-z0-9_-` )";
$lines[] = "(`a-z0-9_-`,
`a-z0-9_-`
,`a-z0-9_-` ,`a-z0-9_-`)";
// these lines below should not match
$lines[] = "(`a-z0-9_-``a-z0-9_-`,`a-z0-9_-`,`a-z0-9_-`)";
$lines[] = "(`a-z0-9_-``a-z0-9_-`,`a-z0-9_-`.`a-z0-9_-`";
$pattern = '/~^\(\s*(?:[a-z0-9_-]+\s*,?\s*)+\)$~/';
$result = array();
foreach($lines as $key => $line)
{
if (preg_match($pattern, $line))
{
$result[$key] = 'Found match.';
}
else
{
$result[$key] = 'Not found a match.';
}
}
print("<pre>" . print_r($result, true). "</pre>");
答案 0 :(得分:1)
你非常接近。看起来你想要这个:
$pattern = "~^\(\s*`[a-z0-9_-]+`\s*(?:,\s*`[a-z0-9_-]+`\s*)*\)$~";
你的正则表达式的两个问题是:
你有两组分隔符(斜线和波浪号) - 只挑一个并坚持下去。我个人的偏好是括号,因为那时你不必为了“仅仅因为分隔符”而逃避任何事情,而且它还有助于我记住整个匹配是匹配数组中的第一个条目。
通过使逗号可选,你允许你不想要的东西。解决方案确实需要重复一点,但更准确。
答案 1 :(得分:0)
你不清楚括号之间数据的匹配规则,你没有真正指定是否要捕获任何东西......我根据你的代码的上下文做了最好的猜测,希望这将满足您的需求。
编辑:固定代码块,以便在模式中显示后缀,也将分隔符从〜更改为/,因为OP对此感到困惑
$pattern = '/^\((\s*`[a-z0-9_-]+`\s*[,)])+$/';
答案 2 :(得分:0)
这是一个通用的重复模式:
preg_match_all("/start_string([^repeat_string].*?)end_string/si", $input, $output);
var_dump($output);