

No.6ベストアンサー
- 回答日時:
だいたいやりたいことが判りました。
ANo.5さんのと余り変わりませんが、サンプルです。
preg_replace_callbackを使っています。
function _get($path) {
$ret = rand(1000, 9999);
echo "path: $path[1] -> $ret\n";
return $ret;
}
function _kaiseki($str) {
do {
echo "str: $str\n";
$str = preg_replace_callback('|\$\(([^()\$]+)\)|', '_get', $str, -1, $cnt);
} while ($cnt > 0);
return $str;
}
$str = '$(DATA_ATR/$(DATA_ATR/$(DATA/hoge)/id)/NO)';
echo 'result: '. _kaiseki($str). "\n";
No.5
- 回答日時:
こんな感じでできないでしょうか?
###文字列を解析する関数
function _kaiseki($str){
$pattern = '/(^.*)(\$\([^\(\)]*\))(.*$)/';
for ($i = 0 ;;++$i) {
//echo $str . "<br />";
preg_match($pattern,$str,$tmp);
$replace_str = _get($tmp[2]);
$replacement = '${1}' . $replace_str . '${3}';
$str = preg_replace($pattern,$replacement,$str);
if (preg_match($pattern, $str) == "") break;
}
return $str;
}

No.4
- 回答日時:
補足を拝見しましたが、いまいちよく判りませんでした。
。。直接的な回答ではありませんが、以下のような方法でプログラムからデータを取扱いしやすくする方法もあります。参考まで。
// '$(aaa/$(bbb/$(aaa/ccc)/id)/NO)' を以下に置換
// → 'array("aaa",array("bbb",array("aaa","ccc"),"id"),"NO")'
// これをevalして、$hogeに代入します。
$str = '$(aaa/$(bbb/$(aaa/ccc)/id)/NO)';
$str = preg_replace(array('/\\b/', '/\\$/', '/\\//'), array('"', 'array', ','), $str);
echo $str. "\n";
eval("\$hoge=$str;");
var_dump($hoge);
evalを使うので、セキュリティ的な問題が無いように注意が必要ですが。
この回答への補足
もう少し補足します。全体的にはこんな流れになります。
$str="$(DATA_ATR/$(DATA_ATR/$(DATA/hoge)/id)/NO)";
echo _kaiseki($str);
###データを置換する関数
function _get($path){
if(preg_match('/^DATA/', $path)){
/*長いのでここは省略します。
解析したパスを渡してデータを取得する関数です。
(例えばidなどを取得します)
*/
}else if(preg_match('/^DATA_ATR/', $path)){
/*ここも長いので省略します。処理は上と同じ*/
}
return $result;
}
###文字列を解析する関数
function _kaiseki($str){
if(preg_match('/^\$/', $str)){
$str = preg_replace('/^\$/', "", $str);
if(preg_match('/^\(([^$()]*)\)$/', $str, $tmp)){
$data = _get($tmp[1]); }else{
/*ここを通るときはこうなってます。
(1)DATA_ATR/$(DATA_ATR/$(DATA/hoge)/id)/NO
処理の流れはまず$(DATA/hoge)を_get()に渡してデータを得ます。
データを得るとこんな感じになるはずです。1111は取得したデータ。
(2)DATA_ATR/$(DATA_ATR/11111/id)/NO
次に$(DATA_ATR/11111/id)のデータを取得します。
また_get()を呼んで処理を行いデータを得ます。そうすると
(3)DATA_ATR/12345/NO になるはずです。
最後にもう一度_get()を呼んで欲しかったデータを取得します。
*/
}
}
return $data;
}
悩んでいるのはこのパスの解析の部分です。よろしくお願いします。
No.3
- 回答日時:
No.1です。
外してるかもしれませんが、こういうことでしょうか?
whileでpreg_replace()をまわしてます。
(コメントアウトしているechoの//をはずせば途中経過が表示されます)
$str="$(aaa/$(bbb/$(aaa/ccc)/id)/NO)";
$replace_str = Array("111","12345");
$pattern = '/(^.*)(\$\([^\(\)]*\))(.*$)/';
for ($i = 0 ;; ++$i) {
//echo $str . "<br />";
$replacement = '${1}' . $replace_str[$i] . '${3}';
$str = preg_replace($pattern,$replacement,$str);
if (preg_match($pattern, preg_replace($pattern,$replacement,$str)) == "") break;
}
echo $str;

No.2
- 回答日時:
$(xxx/yy/zzzzz)/aaa/$(bbb/$($(cc/ddd)/eee/fff)/ggg)
のような文字列にも対処できるような汎用的なものにしたいんでしょうか? なおかつ、$()によるネストの回数に制限が無いとしたら、正規表現では太刀打ちできないと思います。
形式が決まっているのであれば、ANo1さんの方法などでできると思います。
この回答への補足
少し補足させてください。
実際に実装したいと考えているのは以下のような処理です。
$str=$(aaa/$(bbb/$(aaa/ccc)/id)/NO)
$(aaa/ccc)のとき特定の数字(例えば111)を取得して
$(aaa/$(bbb/111/id)/NO)
となり、今度は$(bbb/111/id)のとき特定の数字(例えば12345)を取得します。
そして最後に$(aaa/12345/NO)となってこの文字列が指すあるデータを取得するという処理の流れになります。
このような処理をやりたいと考えていてこの文字列の解析に悩んでいるんです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptで文字分割は、 split() などメソッド不要??? 4 2023/02/06 22:50
- JavaScript ifreamをリロードしたい 1 2022/05/03 16:15
- PHP PHPを使って、別サイトの一部を取得して表示したいのです。。 1 2023/01/18 21:45
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- C言語・C++・C# C言語について質問です。 以下のような結果を出すためにはどのようなコードが良いですか?サンプルコード 3 2022/11/01 16:19
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- C言語・C++・C# プログラミングのペーパーテスト 実行結果がどのように表示されるか答えよ #include <stdi 1 2022/07/09 14:27
- XML XML同じ名前の要素を自動で集約するツール 1 2022/04/11 09:21
- C言語・C++・C# sprintf()の使い方について 1 2022/08/17 16:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複雑な/による文字列の分割につ...
-
正規表現でアンカータグを判別
-
Excelで数字のみを2倍3倍にする...
-
VBAを使ってHTMLソースから特定...
-
preg_matchでエラーが出ます。
-
VBAのコマンドボタンの文字列の...
-
正規表現
-
半角英数文字を全角英数文字に...
-
POSTで文字化け?
-
ソースコードの1行が長いとき...
-
PHPmailerでの添付ファイルの文...
-
ファイルから読み取った改行文...
-
ifの中に改行とコメントを書い...
-
日本語(マルチバイト)でのwor...
-
Excel VBS、ADODB.Streamで改行
-
改行文字を消す方法を教えて頂...
-
エスケープ文字の復帰(¥r)と...
-
Excel関数「COUNTIF」で”文字”...
-
メッセージボックスで1025文字...
-
PHPでHTMLメールを送信、文字化...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPで<a>タグ内からURLと文字を...
-
VBAを使ってHTMLソースから特定...
-
preg_matchでエラーが出ます。
-
PHPで変数から1行目だけを取得...
-
、"(ダブルクォーテーション)...
-
正規表現で「0」のみ抽出
-
電話番号のチェック ハイフン...
-
Smartyで部分一致
-
正規表現でシングルクォーテー...
-
正規表現パターンの記入方法に...
-
preg_matchの正規表現で
-
phpでhtmlソースを解析し、文字...
-
PHPで あるフォルダ内の、特定...
-
PHPメールフォーム URLと半角...
-
正規表現 画像リンクのaltの取得
-
phpで文字列に"や'などが含まれ...
-
正規表現で切り出せません。 <...
-
「半角数字」と「+」を許可する...
-
C#でのワイルドカードを使った...
-
正規表現preg_match('#^(?:[a-z
おすすめ情報