これはかなり紛らわしいですが、できる限り説明しようと思います...
次のような文字列でいっぱいの MYSQL テーブルがあります。
{3}12{2}3{5}52
{3}7{2}44
{3}15{2}2{4}132{5}52{6}22
{3}15{2}3{4}168{5}52
各文字列は、製品オプションとオプション値の組み合わせです。{ } 内の数字はオプションです。たとえば、{3} = 色です。各 { } 番号の直後の番号は、そのオプションの値です (例: 12 = 青)。これらの文字列を解析して情報を正しく配信する方法を知っている PHP コードを既に入手していますが、1 つの例外があります。3,4,2,5,6になります。(現在の順序を受け入れるようにシステムの残りの部分を変更しようとするのは、あまりにも途方もない作業です。) 特定の組み合わせに 5 つのオプションがすべて含まれていなくても問題ありません。たとえば、"{3}7{2}44" は期待される結果。問題は、オプション 2 とオプション 4 を含む組み合わせだけです。オプション 2 とオプション 4 の両方を含む組み合わせ、{4} とそれに対応する値が {2} の前に来て、対応するように順序を入れ替える必要があります。価値。
列を Excel に取り込み、Text to Columns を使用して「{」と「}」の文字で分割し、列の順序を変更しようとしましたが、すべての文字列が同じ数の列を生成するわけではないため、順序は次のようになります。他の方法で台無しになっています (オプション 5 がオプション 2 の前に来るなど)。
また、区切り記号として「}」を使用して、PHP を使用して各文字列を配列に分解することも試しました (後で再ソートできると思いました)。それらを使用できなくする方法。
TL;DR: 上記のような文字列がたくさんあります。「{2}」と「{4}」の両方を含むすべての文字列で、{4} とそれに続く数字が {2} の前に来るように、これらの両方の値の配置を切り替える必要があります。そしてそれに続く数字。言い換えると:
{3}15{2}3{4}168{5}52
なる必要がある
{3}15{4}168{2}3{5}52
疑似コードで解決策に最も近いのは、次のようなものです。
for each string,
if "{4}" is present in this string AND "{2}" is present in this string,
take the "{4}" and every digit that follows it UNTIL you hit another "{" and store that substring as a variable, then remove it from the string.
then, insert that substring back into the string, at a position starting immediately before the "{2}".
それが何らかの意味を持っていることを願っています...
PHP、Excel、Notepad++、正規表現などでこれを行う方法はありますか? どんな助けでも非常に高く評価されます。
追加するために編集: 私が試した解決策を数人が投稿した後、私のホストが PHP 5.2.17 を実行していることに言及することが重要であることに気付きました。みんなのソリューションに賛成票を投じることができれば(すべてPHPサンドボックスで試し、すべてうまくいきました)、そうしますが、私の担当者は低すぎます。