使用preg_match重复模式

时间:2013-02-03 03:35:04

标签: php preg-match

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

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

由于

已更新

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

3 个答案:

答案 0 :(得分:1)

你非常接近。看起来你想要这个:

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

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

  1. 你有两组分隔符(斜线和波浪号) - 只挑一个并坚持下去。我个人的偏好是括号,因为那时你不必为了“仅仅因为分隔符”而逃避任何事情,而且它还有助于我记住整个匹配是匹配数组中的第一个条目。

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

答案 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);