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*)*\)$~";

正規表現に関する2つの問題は次のとおりです。

  1. 2セットの区切り文字(スラッシュとチルダ)がありました。1つだけを選択して、それを使用してください。私の個人的な好みは括弧です。これは、「区切り文字だけで」何もエスケープする必要がないためですが、一致全体が一致配列の最初のエントリであることを思い出すのにも役立ちます。

  2. カンマをオプションにすることで、不要なものを許可していました。解決策には少し繰り返す必要がありますが、より正確です。

于 2013-02-03T05:57:51.317 に答える
0

かっこ間のデータの一致ルールについてはあまり明確ではなく、何かをキャプチャするかどうかを実際に指定していなかったので、コードのコンテキストに基づいて最善の推測を行いました。あなたのニーズに合っています。

編集:パターンにバックティックが表示されるようにコードブロックを修正しました。また、OPが混乱していたため、区切り文字を〜から/に変更しました。

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

一般的な繰り返しパターンは次のとおりです。

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