0

我希望能够验证下面的字符串以允许反引号之间的数据无限次,只要它后面跟着一个逗号,如果它不是逗号必须是“)”。空格只允许在反引号之外,不在其中。

我对正则表达式没有经验,所以我不知道如何允许重复模式。以下是我到目前为止的模式。

谢谢

更新

// 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>");
4

3 回答 3

1

你很亲密。看起来你想要这个:

$pattern = "~^\(\s*`[a-z0-9_-]+`\s*(?:,\s*`[a-z0-9_-]+`\s*)*\)$~";

您的正则表达式的两个问题是:

  1. 你有两组分隔符(斜线和波浪号)——只选择一个并坚持下去。我个人的偏好是括号,因为这样你就不必“仅仅因为分隔符”而转义任何东西,而且它也帮助我记住整个匹配是匹配数组中的第一个条目。

  2. 通过使逗号可选,你允许你不想要的东西。解决方案确实涉及重复自己一点,但它更准确。

于 2013-02-03T05:57:51.317 回答
0

这是一个通用的重复模式:

preg_match_all("/start_string([^repeat_string].*?)end_string/si", $input, $output);
var_dump($output);
于 2013-12-05T17:56:54.570 回答
0

好吧,您对括号之间数据的匹配规则不是很清楚,并且您并没有真正指定是否要捕获任何内容,所以...我根据您的代码上下文进行了最佳猜测,希望这会适合您的需求。

编辑:修复了代码块,因此它会显示模式中的反引号,还将分隔符从 ~ 更改为 / 因为 OP 对此感到困惑

$pattern = '/^\((\s*`[a-z0-9_-]+`\s*[,)])+$/';
于 2013-02-03T03:48:53.710 回答