1

パターンマッチのカウントを取得してから、パターンをカウントに置き換えるにはどうすればよいですか。

私がすべて一致させようとしているパターンは、文字列内の bbcode スタイルのタグです。

例: これは、すべての単語が [青]色[/青] である [青]テキスト[/青] の段落です。

[@@1@@] や [@@2@@] のように、各タグを数字と追加のテキストに置き換える必要があります。

パターンを preg_match('/[blue](.*?)[/blue]/i',$string) と一致させることも、preg_replace を置き換えることもできます。

しかし、これらの関数のいずれかを使用してカウントを取得し、一致をそのカウント位置に置き換えるにはどうすればよいですか?

4

2 に答える 2

1

preg_replace_callback を試してください:

$result = preg_replace_callback('/(\[blue\])([\[]*)(\[\/blue\])/i', function ($matches) {
    static $incr = 0;
    ++$incr;
    return '[@@'.$incr.'@@]'.$matches[2].'[@@'.$incr.'@@]';
}, $text);

詳細については、マニュアルを参照してください

于 2012-11-16T15:45:35.223 に答える
1

$matches パラメータを使用できます。

int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )

渡す$matchesと、すべての結果を含む配列が返されます。count($matches)カウントを返すために使用してください!

編集: $matches 配列を取得したら、配列のキーをカウント値として使用してそれらを置き換えることができます。

foreach($matches as $k=>$mat){
preg_replace ( /*same pattern*/,"[@@".$k."@@]", /* same subject */,1); //fourth param is to replace only one!
}

これを試して!

EDIT2: 正しいのは preg_replace ではなく preg_match (私の EDIT) です。

于 2012-11-16T14:21:34.477 に答える