0

私はできる限り最善の方法で私の質問を説明しようとします...わかりました。

私はこのような複数行の文字列を持っています:

Hello World
And again Hello <a:b:c>
And again ...

今、私は置き換えたいのですが、それは最初の文字、2番目の文字などに依存します. 3 つの引数を持つ配列を取得するための正規表現スニペットがあります。

arr = ('a', 'b', 'c')

これで、最初の引数を分析するスイッチができました。

switch (arr[0]) {
         case 'a':
              // do this
         [...]
}

最初の引数がaiの場合、<a:b:c>何かに置き換えたい.

問題は次のとおりです。引数を取得するには、preg_split を使用します。文字列の右側の部分をどのように置き換えることができるようになりましたか? 私は位置を取得できますPREG_SPLIT_OFFSET_CAPTUREが、それは複数行の文字列であり、(!) 何かに置き換えると、他の一致の位置 (可能な n-一致があります) も変更する必要がありますよね?

多分あなたはこれを解決するための解決策を持っていますか?

私は preg_replace が機能する可能性があると考えましたが、文字 (たとえば 2 番目のb) が動的なパラメーターになる可能性があるため、これを解決するには間違った関数だと思います。関数 preg_replace を間違った方法で理解したのかもしれません...しかし...これを解決する方法が本当にわかりません。この問題を解決するために私が何かを読むことができるドキュメントを持っているかもしれません (私を php.net にリンクしないでください - 私はすでにそれを読んでいます) またはあなたはアイデアを持っています.

4

2 に答える 2

1
// This function will replace specific matches into a new form
function RewriteText($Match)
{
  $EntireSection = $Match[0];
  $GroupOne = $Match[1];
  // ...
  return $Value;
}

$NewText = preg_replace_callback('/Hello\s+(\S+)/i', "RewriteText", $Text);
于 2012-08-21T15:00:44.450 に答える
0

私があなたの質問を正しく理解していれば、文字列内のテキストを置き換えたいと考えていますが、置換は、一致した最初の文字のみに基づいていますか?

これが正しければ、PHP のpreg_replace_callback(). 次のようなものが機能するはずです。

function replace_callback($matches) {
    switch ($matches[0]) {
        case 'a': return 'whatever';
    }
}

$str = preg_replace_callback('/<([a-z]):([a-z]):([a-z])>/ig', "replace_callback", $str);
于 2012-08-21T15:01:46.507 に答える