以下是一些可重複使用的模式。我使用带有 'x' 修飾符的註解來提高人類可讀性。
您還可以編寫一個函數,該函數會為指定的括號/引號對產生模式。
<?php
$simple_pattern = "( (?#根模式)
( (?#文字或表達式)
(?>[^\\(\\)]+) (?#文字)
|
\\((?-2)\\) (?#表達式和遞迴)
)*
)";
$simple_okay_text = "5( 2a + (b - c) ) - a * ( 2b - (c * 3(b - (c + a) ) ) )";
$simple_bad_text = "5( 2)a + (b - c) ) - )a * ( ((2b - (c * 3(b - (c + a) ) ) )";
echo "簡單模式結果:\n";
var_dump(preg_match("/^$simple_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$simple_pattern\$/x",$simple_bad_text));
echo "\n----------\n";
$full_pattern = "( (?#根模式)
( (?#文字或表達式)
(?>[^\\(\\)\\{\\}\\[\\]<>]+) (?#文字不包含括號)
|
(
[\\(\\{\\[<] (?#起始括號)
(?(?<=\\()(?-3)\\)| (?#如果是一般括號)
(?(?<=\\{)(?-3)\\}| (?#如果是大括號)
(?(?<=\\[)(?-3)\\]| (?#如果是方括號)
(?1)\\> (?#否則如果是標籤)
))) (?#關閉巢狀但邏輯上相同層級的子模式)
)
)*
)";
$full_okay_text = "5( 2a + [b - c] ) - a * ( 2b - {c * 3<b - (c + a) > } )";
$full_bad_text = "5[ 2a + [b - c} ) - a * ( 2b - [c * 3(b - c + a) ) ) }";
echo "完整模式結果:\n";
var_dump(preg_match("/^$full_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$full_pattern\$/x",$full_bad_text));
echo "\n----------\n";
$extrafull_pattern = "( (?#根模式)
( (?#文字或表達式)
(?>[^\\(\\)\\{\\}\\[\\]<>'\"]+) (?#文字不包含括號和引號)
|
(
([\\(\\{\\[<'\"]) (?#起始括號)
(?(?<=\\()(?-4)\\)| (?#如果是一般括號)
(?(?<=\\{)(?-4)\\}| (?#如果是大括號)
(?(?<=\\[)(?-4)\\]| (?#如果是方括號)
(?(?<=\\<)(?-4)\\>| (?#如果是標籤)
['\"] (?#否則如果是靜態)
)))) (?#關閉巢狀但邏輯上相同層級的子模式)
)
)*
)";
$extrafull_okay_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a) > }\" )";
$extrafull_bad_text = "5( 2a + ['b' - c] ) - a * ( 2b - \"{c * 3<b - (c + a) > }\" )";
echo "超完整模式結果:\n";
var_dump(preg_match("/^$extrafull_pattern\$/x",$simple_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$full_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_okay_text));
var_dump(preg_match("/^$extrafull_pattern\$/x",$extrafull_bad_text));
?>