Вы можете немного упростить свою жизнь, добавив константу "PREG_SET_ORDER" и preg_match_all()
вместо preg_match()
примерно так:
$content = "
<!-- CLTAG xstreet0=Inman -->
<!-- CLTAG xstreet1=Moscrop -->
<!-- CLTAG city=Burnaby -->
<!-- CLTAG region=BC -->
";
$pattern = '/<!--\sCLTAG\s([^=]+)=([^\s]+)\s-->/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo 'key: ' . $match[1] . ' | value: ' . $match[2] . "\n";
}
Если вы столкнулись со сценарием, в котором не было указано значение "xstreet1" (поскольку адреса могут работать таким образом), вам необходимо немного изменить шаблон регулярного выражения и добавить проверку, чтобы убедиться, что вторая группа существует в вашем цикле:
$pattern = '/<!--\sCLTAG\s([^=]+)=([^\s]+)?\s-->/';
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
echo 'key: ' . $match[1] . ' | value: ';
echo empty($match[2]) ? 'N/A' : $match[2];
echo "\n";
}
Обратите внимание, как есть '?' добавлено после второй группы захвата в регулярном выражении. Это говорит компилятору регулярного выражения, что эта группа может встречаться или не встречаться.