0

私は使用しています

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

<?との間のすべての内容を検索する?>

<?ここで、との間にないものをすべて見つけたいと思います。?>

私は試しています

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

しかし、それはうまくいかないようです...

4

2 に答える 2

0

非正規表現アプローチ

$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);

出力

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


2 some words
2 some words

asdf
sdfs
于 2010-03-18T10:32:14.733 に答える
0

さて、この問題には複数のアプローチがあります。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(?=.)((?:(?!<\?).)*)(?:<\?((?!\?>).)*(\?>|$)|$)/spreg_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, ";
}

?>
于 2010-03-18T10:35:07.190 に答える