Belirli etiketler arasında değil ilginiz bulmak

2 Cevap php

I istimal

preg_match_all('/<?(.*)?>/', $bigString, $matches, PREG_OFFSET_CAPTURE);

<? ve ?> arasındaki her şeyin içeriğini bulmak için

Şimdi <? ve ?> arasında değil her şeyi bulmak istiyorum

Ben çalışıyorum

preg_match_all('/^(<?(.*)?>)/', $bigString, $nonmatches, PREG_OFFSET_CAPTURE);

ama çalışmak için görünmüyor ...

2 Cevap

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, ";
}

?>

non regex yaklaşım

$str=<<<EOF
1 some words
1 some more words
<?
blah blah
blah blah
?>
2 some words
2 some words <?
jdf
sdf ?>
asdf
sdfs
EOF;

$s = explode('?>',$str);
foreach($s as $v){
  $m = strpos($v,'<?');
  if($m!==FALSE){
     print substr($v,0,$m)."\n";
  }
}
print end($s);

çıktı

$ php test.php
1 some words
1 some more words


2 some words
2 some words

asdf
sdfs