アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPで括弧内のカンマを別の文字に置換したいのですが、どのようにしたらよいか困っています。
条件は次のとおりです。

------------------------------------------------------------
対象文字列:(**,**,**,…)
対象文字列は、「(),」を含めすべて全角です。
**の文字数は、0~nです。
**には、「(),」の文字は含まれません。
括弧は、「(**,**(**,**,**,…),**)」のように、入れ子になることがあります。入れ子の階層には特に制限はありません。
カンマ「,」を別の文字(例えば「$$comma$$」)に置換したい。
------------------------------------------------------------

preg_replace()で実現できるものでしょうか。
ご教示の程よろしくお願いいたします。

質問者からの補足コメント

  • うーん・・・

    私のケースの場合、

    $regex = '#\[i]((?:[^[]|\[(?!/?i])|(?R))+)\[/i]#';

    をどう作ったらよいのでしょうか。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/02/03 15:43
  • うれしい

    Ogre7077様

    所望の結果が得られました。
    ありがとうございます。

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/02/03 16:52

A 回答 (3件)

$括弧階層数 = 0;


$置換文字列 = '';
foreach(str_split($対象文字列) as $c){
_ if ($c == 括弧開き) $括弧階層数++;
_ if ($c == 括弧閉じ && $括弧階層数 > 0) $括弧階層数--;
_ if ($c == カンマ && $括弧階層数 > 0) {
_ _ $置換文字列 .= 別の文字;
_ } else {
_ _ $置換文字列 .= $c;
_ }
}
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
シンプルにできそうです。
後ほど試してみます。
実装時は、str_splitをマルチバイト対応で組めばよいですよね。

お礼日時:2016/02/03 15:53

ちょいと調べてみた.



再帰的パターンを作る (?R) と preg_replace_callback の組み合わせでできるかもしれん.

例えば
https://bbs.archlinux.org/viewtopic.php?id=47542
みたいな感じ.
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご紹介いただいたページを拝見しました。
#4の方が提示されているコードでしょうか。
リテラシー不足で申し訳ないのですが、このコードは、[i]*[/i]で囲まれた文字列を、入れ子を構造を考慮し、<span style="font-style: italic;">*</span>に置換する内容でしょうか。

お礼日時:2016/02/03 15:32

入れ子があって対で処理しなくちゃいけないとなると正規表現での一発処理は難しいかも


当然
(**,**)**,**,**(**,**)

(****)**,**,**(****)
としたいんですよね?
最初にあらわれた「(」から「)」が同じ数現れるまでを探さないといけないので
結構な再起処理になるかも
(**,**(**,**,**(**,**)
のように必ずしも閉じているとは限らないわけですから・・
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
正規表現の置換を何回かしてできればと思っていますが、
やはり、XMLの構造解析みたいなことしないといけないのでしょうか。

お礼日時:2016/02/03 14:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!