Peki, bu konuya birden fazla yaklaşımlar vardır. Bir yolu, dışarıda onların uzaklıklar ve uzunluklarını bulmak ve temelde sadece orijinal dizeden bu parçaların dışarı çıkarmak istediğiniz öğeleri yakalamak ve sol konum tüm etiketlerinin dışına parçalardır.
İşte bir örnek olarak bir fonksiyonudur:
<?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, ";
}
?>
Alternatif olarak, preg_match_all
alt desen biri haline etiketlerinin dışında tüm parçaları yakalamak için bu normal ifadeyi /\G(?=.)((?:(?!<\?).)*)(?:<\?((?!\?>).)*(\?>|$)|$)/s
kullanabilirsiniz. Rağmen, etiketleri eşit belgede uyumlu değilse o, kendi zorluklar bulunuyor olabilir.
Örneğin,
<?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, ";
}
?>