独自形式の文字列を、htmlタグに変換する処理を行っています。
例えば、以下の文字列に対し、
PHP
1$str = "{img:sample1.jpg}";
以下の処理を行い、
PHP
1while( preg_match('/{([^{}]+)}/', $str, $match) ){ 2 list($key, $p1, $p2) = explode(':', $match[1]); 3 switch($key){ 4 case 'img': 5 $v = '<img src="'.$p1.'">'; 6 $str = str_replace($match[0], $v, $str); 7 break; 8 case 'tr': 9 $v = '<tr><th>'.$p1.'</th><td>'.$p2.'</td></tr>'; 10 $str = str_replace($match[0], $v, $str); 11 break; 12 } 13}
これは、以下のように期待通りに変換されます。
HTML
1<img src="sample.jpg">
一応、{} をネストできるようにしたつもりですので
PHP
1$str = '<table>' 2 . '{tr:サンプル1:{img:sample1.jpg}}' 3 . '{tr:サンプル2:{img:sample2.jpg}}' 4 . '</table>';
を処理すれば、以下のようになることを期待していますが、
HTML
1<table> 2<tr><th>サンプル1</th><td><img src="sample1.jpg"></td></tr> 3<tr><th>サンプル2</th><td><img src="sample2.jpg"></td></tr> 4</table>
以下のようになってしまいます。
HTML
1<table> 2<tr></tr> 3<tr></tr> 4</table>
どこが間違っているのかがわからず困っています。
間違っている点をご指摘いただければありがたいです。
の前に
> :
そもそもこのコード、ポツンとある↑でエラー出てますよ。
ごめんなさい。
「他にも同じような処理がある」という意味で、省略したつもりでした。
(途中省略)に変更します。
エラーで困っていないのでしたらエラーが出ないコードをご提示ください。
あまり省略されすぎると再現確認できないので、半端に省略するくらいなら改めて再現できる最小構成のコードを組んでご提示ください。
省略をなくしました。
> 一応、{} をネストできるようにしたつもりですので
ネスト化前と間違えてコピペしていませんか?
ああ、失礼しました。正規表現で再帰をやるんじゃなくて、ループで再帰を処理しているんですね。
PHP 7.3.12 ではうまくいきました。
PHP 7.3.12 ではうまくいくんですね。検証ありがとうございました。^^
こちらは PHP 7.3.9 までしか利用できない環境です。
やはり PHPのバージョンの問題なんですかね。
7.2.17と、7.3.8で動作確認をしましたが、どちらも期待通りの正しい結果になりましたので、バージョン差異に問題はなく、提示されたコード以外に原因があるのかもしれないなと思いました。
お手元で現象が確認できるコードを分割せずに、「独自形式の文字列の定義」「正規表現によるHTMLへの置換処理」「画面に出力」までの通したコードでご提示いただけると良いかもしれません。
正規表現うんぬんよりも、jsonなどもっと効率的なデータの持ち方にすれば
無駄に悩む必要はないと思いますが・・・
あ、もっと古いバージョン(5とか)なのかと思っていました。mix-peachさんの通り、バージョンの問題ではなさそうです。
提示させていただいた内容を、そのまま実行したら、皆さんおっしゃるように、期待通りの結果になりました。
元々のコードは、定義部分を json 化しており、変換処理を汎用化しようとして、かなり長文化しているため、全文を掲載するには無理がありますので、要点を提示したつもりでしたが、その部分には問題ではなかったようです。
他の部分を見直します。
みなさん、お騒がせしました。申し訳ありません。
長いコードは、抜粋して、実行して、解決したい現象が出ることを確認してから、コピペしましょう。
ippyaさん
解決しましたら下のフォームに解決方法を入力いただき自己解決とすることで同じ悩みを待っている方が迅速に的確に解を得られやすくなります。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー