![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
PHPで括弧内のカンマを別の文字に置換したいのですが、どのようにしたらよいか困っています。
条件は次のとおりです。
------------------------------------------------------------
対象文字列:(**,**,**,…)
対象文字列は、「(),」を含めすべて全角です。
**の文字数は、0~nです。
**には、「(),」の文字は含まれません。
括弧は、「(**,**(**,**,**,…),**)」のように、入れ子になることがあります。入れ子の階層には特に制限はありません。
カンマ「,」を別の文字(例えば「$$comma$$」)に置換したい。
------------------------------------------------------------
preg_replace()で実現できるものでしょうか。
ご教示の程よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
$括弧階層数 = 0;
$置換文字列 = '';
foreach(str_split($対象文字列) as $c){
_ if ($c == 括弧開き) $括弧階層数++;
_ if ($c == 括弧閉じ && $括弧階層数 > 0) $括弧階層数--;
_ if ($c == カンマ && $括弧階層数 > 0) {
_ _ $置換文字列 .= 別の文字;
_ } else {
_ _ $置換文字列 .= $c;
_ }
}
ご回答ありがとうございます。
シンプルにできそうです。
後ほど試してみます。
実装時は、str_splitをマルチバイト対応で組めばよいですよね。
No.2
- 回答日時:
ちょいと調べてみた.
再帰的パターンを作る (?R) と preg_replace_callback の組み合わせでできるかもしれん.
例えば
https://bbs.archlinux.org/viewtopic.php?id=47542
みたいな感じ.
ご回答ありがとうございます。
ご紹介いただいたページを拝見しました。
#4の方が提示されているコードでしょうか。
リテラシー不足で申し訳ないのですが、このコードは、[i]*[/i]で囲まれた文字列を、入れ子を構造を考慮し、<span style="font-style: italic;">*</span>に置換する内容でしょうか。
No.1
- 回答日時:
入れ子があって対で処理しなくちゃいけないとなると正規表現での一発処理は難しいかも
当然
(**,**)**,**,**(**,**)
↓
(****)**,**,**(****)
としたいんですよね?
最初にあらわれた「(」から「)」が同じ数現れるまでを探さないといけないので
結構な再起処理になるかも
(**,**(**,**,**(**,**)
のように必ずしも閉じているとは限らないわけですから・・
ご回答ありがとうございます。
正規表現の置換を何回かしてできればと思っていますが、
やはり、XMLの構造解析みたいなことしないといけないのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字列の括弧について(初心者)
-
nl2brが効かないのですが・・・
-
sedでの最短一致の書き方
-
○分から○時間○分に変換
-
PHPの文字列比較(IF文)
-
ダブルクォーテーションが置換...
-
VBAのコマンドボタンの文字列の...
-
COBOLの改行
-
最終行の改行について
-
phpのメールフォームの完了画面...
-
ソースコードの1行が長いとき...
-
なぜインターネットでは半角カ...
-
テキストボックス行の桁数を制...
-
エスケープ文字の復帰(¥r)と...
-
文字の入力で横バー上段、中断...
-
エクセルでの漢字、カタカナ、...
-
ファイルから読み取った改行文...
-
VBAで英数字入力チェックしたい。
-
Excel VBAからBeckyを起動して...
-
キャリッジリターンとラインフ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ダブルコーテーション(
-
VBSで"をエスケープする文字は?
-
文字列の置換をCStringで(C++)
-
ダブルクォーテーションが置換...
-
文字列の括弧について(初心者)
-
PHPの¥
-
○分から○時間○分に変換
-
php 正規表現で、\\マークを取...
-
REGEXREPLACE関数について、
-
nl2brが効かないのですが・・・
-
mcryptで英数字(12未満)のみに...
-
入力文字に\\マークが入ってい...
-
文字列のアスタリスク置換
-
PHPの文字列比較(IF文)
-
【PHP】preg_replace() で正...
-
PHPでCSVを出力する際のセルに...
-
正規表現で<BR>の行を除外した...
-
正規表現。指定文字列を抜き出...
-
ダブル、シングルクォーテーシ...
-
PHPでは文字列の連結に.を使い...
おすすめ情報
私のケースの場合、
$regex = '#\[i]((?:[^[]|\[(?!/?i])|(?R))+)\[/i]#';
をどう作ったらよいのでしょうか。
Ogre7077様
所望の結果が得られました。
ありがとうございます。