0

[より良い説明のために私の編集をチェックしてください]

私が持っている非常に大きな文字列について助けが必要です。

こんな感じです:

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";

ブレークラインではなく、空白として。

これをよく見ると、次のような2つの文字列です。

$splited_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";

私はこれpreg_splitを検索する必要があると思います$big_string

TinteiroID:[only numbers]#TinteiroLABEL:[any character, except "#"]#TinteiroREF:[any character, except "#"]#TinteiroMARCA:[any character, except "#"]#TinteiroGENERO:[any character, except "#"]#TinteiroQUANTIDADE:[only numbers]#FIMPROD#

$splited_string[]角かっこ内にストライプを付けて、そこにある可能性のある文字を引用しています。

[]角かっこではなく、受け入れる必要のある各タイプの文字の正規表現トークンである必要があります。しかし、私はこれについてほとんど知りません。

そして、それぞれ$splited_stringを配列に格納し$arrayます。

誰かがこれを達成する方法の手がかりを与えることができますか?

ありがとう

編集:

私は自分の論理を説明しようとしています。

私はこの大きな文字列を持っています(ブレークラインなし):

TinteiroID:1#

TinteiroLABEL:HP CB335EE#

TinteiroREF:CB335EE#

TinteiroMARCA:HP#

TinteiroGENERO:Tinteiro Preto Reciclado#

TinteiroQUANTIDADE:23#

FIMPROD#


TinteiroID:4#

TinteiroLABEL:HP 51633 M#

TinteiroREF:51633 M#

TinteiroMARCA:HP#

TinteiroGENERO:Tinteiro Preto Reciclado#

TinteiroQUANTIDADE:12#

FIMPROD#

それらは2つの小さな文字列に分割できます。

preg-splitを使用して、これらの文字列に似ているが、値が異なる各分割文字列を割り当てたいと思いました。

TinteiroID:[only numbers]#

TinteiroLABEL:[any character, except "#"]#

TinteiroREF:[any character, except "#"]#

TinteiroMARCA:[any character, except "#"]#

TinteiroGENERO:[any character, except "#"]#

TinteiroQUANTIDADE:[only numbers]#

FIMPROD#

次に、分割された各文字列を配列に追加します。

Array
(
    [0] => TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#
    [1] => TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#
)

そして、配列内のすべてのオブジェクトに入るforeachループがあります。[0] [1] ...

別の正規表現を実行して値を収集し、それらの値を使用して何かを実行します。

はい、その「乱雑」で多くのCPUを必要としますが、..私にはこれ以上のアイデアはありません:S


編集:

アドバイスに従う:

私はこのコードを実行しました:

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#";
$array = explode("FIMPROD#", $big_string);

print_r ($array);

これは、big_stringを各「FIMPROD#」の最後の区切り文字に分割します。

今、私は配列に行き、その中の値ごとに行きました。それで何かをしなさい。

私は今それを試みます...私はそれをすることができたかどうかにかかわらず何かのケースを投稿します。

4

5 に答える 5

1

以下のコードを試してください。

 <?php
    $str = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
    preg_match_all("/([A-Za-z]+)\:([^#]+)/", $str, $matches);
    print_r($matches);
    ?>

文字列を配列に変換するために必要な関数付き/([A-Za-z]+)\:([^#]+)/の正規表現は1つだけです。preg_match_allしかし、それがあなたが必要としているものであるかどうかはわかりません。

オンラインのPHP正規表現テスターがお手伝いします。

于 2009-10-05T06:21:25.900 に答える
1

これで次のようになります。

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i"
于 2009-10-03T13:50:48.047 に答える
1

preg_split()を使用することの難しさは、文字列を2つの異なる式で分割する必要があるように見えることです\d+[^#]+

弦を細かく分割してから、元に戻すことを検討する必要があると思います。

1つのpreg_split()で分割を実行しようとすると、さらに複雑になります。

また、文字列を左右にスクロールする必要があるため、質問の文字列全体を表示することも困難です。

編集:はい、サイレントゴーストが多かれ少なかれ言ったように、あなたは正規表現で分割していません[^#]+、あなたは実際に分割する必要があります、あるいはもっと良いのは#文字で爆発します。

次に、おそらく各文字列の最初の要素として「TinteiroID」をチェックすることにより、配列を2つ以上の小さな文字列として元に戻すことができます。

于 2009-10-03T14:05:58.157 に答える
1

なぜここで正規表現が必要なのですか?二度割ってみませんか?

$num = 6;            # number of elements to in each splited_string
$out = array();
foreach ($explode('#', $big_string) as $str) {
    $tmp = explode(':', $str, 2);
    if (count($tmp) == 2) {
        $out[] = $tmp[1];
    }
}
$subs = intval(count($out) / $num);  # how many splited_strings in the big string
for ($i=0; $i<$sub; $i+$num) {
    $each_id = array_slice($out, $i, $i+$num);  # contains six strings
}

ここでは、各反復で$each_id6つの文字列が含まれますが、最初と最後の要素を整数に変換する必要があります。

于 2009-10-03T14:14:55.173 に答える
0

preg_splitから3つの結果が得られますが、2つあるはずですか?

そして、値がありませんか?

<?php
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";
$array = preg_split("~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i", $big_string);
print_r ($array);
?>

出力:

Array
(
    [0] => 
    [1] => 
    [2] => 
)
于 2009-10-03T14:01:24.380 に答える