正規表現は必要ありません。投稿された webbandit のような単純な正規表現を使用して、最も基本的なケースでやろうとしていることを達成できますが、より複雑な例 (私のコメントのようなもの) ではうまくいきません。
これは、より良い正規表現と先読みで回避できますが、それはあなたが望むものではありません。文字列の照合を行っており、これを実行するには有限のマシンを使用する必要があります。PHP の文字列アルゴリズムを使用すると、より適切に機能する、すばやくダーティーなものを提供できます。たとえば、
<?php
$text = "[reply] something [reply] bla bla bla [reply] something else [reply]";
$matches = array();
$lastMatch = 0;
$matchCount = 0;
$search = "[reply]";
while(true) {
$thisMatch = strpos($text, $search, $lastMatch+1);
if($thisMatch === FALSE)
break;
if(++$matchCount % 2 == 0)
{
$lastMatch = $thisMatch;
continue;
}
//print substr($text, $lastMatch + strlen($search), $thisMatch - $lastMatch - strlen($search)) . "\n";
array_push($matches, substr($text, $lastMatch + strlen($search), $thisMatch - $lastMatch - strlen($search)));
$lastMatch = $thisMatch;
}
print_r($matches);
?>
で一連の返信を返します$matches
。
出力:
[mqudsi@iqudsi:~/Desktop]$ php reply.php
Array
(
[0] => something
[1] => something else
)
[reply]
との修正された質問[/reply]
の場合、解決策は次のとおりです。
$text = "[reply] something [/reply] bla bla bla [reply] something else [/reply]";
$matches = array();
$end = -1;
while(true) {
$start = strpos($text, "[reply]", $end+1);
$end = strpos($text, "[/reply]", $start+1);
if($start === FALSE || $end === FALSE)
break;
array_push($matches, substr($text, $start + strlen("[reply]"), $end - $start - strlen("[reply]")));
$lastMatch = $thisMatch;
}