バックグラウンド
0d0a
usingの出現ごとに文字列を分割して作成した配列がありますpreg_split('/(?<=0d0a)(?!$)/')
。
例えば:
$string = "78781110d0a78782220d0a";
次のように分割されます。
Array ( [0] => 78781110d0a [1] => 78782220d0a )
有効な配列要素は、で始まり、7878
で終わる必要があり0d0a
ます。
問題
しかし、場合によって0d0a
は、文字列に追加の無効な配列要素に分割されるものがあります。つまり、それは で始まりません7878
。
たとえば、次の文字列を使用します。
$string = "78781110d0a2220d0a78783330d0a";
これは次のように分割されます。
Array ( [0] => 78781110d0a [1] => 2220d0a [2] => 78783330d0a )
しかし、実際には次のようにする必要があります。
Array ( [0] => 78781110d0a2220d0a [1] => 78783330d0a)
私の解決策
これを回避するために、次の(面倒な)コードを作成しました。
$data = Array('78781110d0a','2220d0a','78783330d0a');
$i = 0; //count for $data array;
$j = 0; //count for $dataFixed array;
$dataFixed = $data;
foreach($data as $packet) {
if (substr($packet,0,4) != "7878") { //if packet doesn't start with 7878, do some fixing
if ($i != 0) { //its the first packet, can't help it!
$j++;
if ((substr(strtolower($packet), -4, 4) == "0d0a")) { //if the packet doesn't end with 0d0a, its 'mostly' not valid, so discard it
$dataFixed[$i-$j] = $dataFixed[$i-$j] . $packet;
}
unset($dataFixed[$i-$j+1]);
$dataFixed = array_values($dataFixed);
}
}
$i++;
}
説明
最初に配列を別の配列にコピーします$dataFixed
。配列のforeach
ループで、$data
で始まるかどうかを確認し7878
ます。そうでない場合は、前の配列と結合し$data
ます。次に、現在の配列の設定を解除し$dataFixed
、配列要素を でリセットしarray_values
ます。
しかし、私はこの解決策についてあまり自信がありません..より良い、より効率的な方法はありますか?
アップデート
0d0a
入力文字列が想定どおりに終わらない場合はどうなりますか? 前の配列要素に固執します..
例: string78781110d0a2220d0a78783330d0a0000
では、0000
別の配列要素として分離する必要があります。