さて、この問題には複数のアプローチがあります。1 つの方法は、除外するアイテムをキャプチャし、それらのオフセットと長さを見つけて、基本的に元の文字列からそれらの部分を抽出するだけで、タグの外側の部分だけが残ります。
例として関数を次に示します。
<?php
function match_all_except ($pattern, $string)
{
preg_match_all($pattern, $string, $match, PREG_OFFSET_CAPTURE);
$parts = array();
$pos = 0;
foreach ($match[0] as $info)
{
$parts[] = substr($string, $pos, $info[1] - $pos);
$pos = $info[1] + strlen($info[0]);
}
$parts[] = substr($string, $pos);
return $parts;
}
$string = 'one<? foo ?>two<? bar ?>three';
$parts = match_all_except('/<\?.*?\?>/s', $string);
// Will output "one, two, three, "
foreach ($parts as $outside)
{
echo "$outside, ";
}
?>
または、この正規表現を使用し/\G(?=.)((?:(?!<\?).)*)(?:<\?((?!\?>).)*(\?>|$)|$)/s
てpreg_match_all
、タグの外側のすべての部分をサブパターン 1 にキャプチャすることもできます。ただし、タグがドキュメント内で均等に一致していない場合は、独自の問題がある可能性があります。
例えば、
<?php
$string = 'one<? foo ?>two<? bar ?>three';
preg_match_all('/\G(?=.)((?:(?!<\?).)*)(?:<\?((?!\?>).)*(\?>|$)|$)/s', $string, $match);
// Will output "one, two, three, "
foreach ($match[1] as $outside)
{
echo "$outside, ";
}
?>