Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sting in Array zerlegen

16 views
Skip to first unread message

Frank Kirschner

unread,
Mar 8, 2011, 8:46:12 AM3/8/11
to
Hallo,

Ich möchte folgende Zeichenkette zerlegen und in ein Array schreiben
(Jede Zeile endet mit [CR][LF])

<AUTH>fail
<VALIDTO>00.00.0000

und den Array dann so auslesen:

echo $arr[AUTH]; ---> Ausgabe: fail
echo $arr[VALIDTO]; ---> Ausgabe: 00.00.0000

Ich würde als erstes mit explode() als Delimiter \r\n verwenden.
Danach würde ein

echo $arr[0]; ---> <AUTH>fail ausgeben

Wie mache ich dann weiter, um an oben genanntes Ziel zu kommen?

lg
Frank

Karl Pflästerer

unread,
Mar 8, 2011, 10:08:24 AM3/8/11
to
Frank Kirschner <147...@celebrate.de> writes:

ich würde stattdessen einen regulären Ausdruck nutzen:

In $s steht dein String:

php > preg_match_all('~^<([^>]+)>(.*)~m', $s, $m, PREG_SET_ORDER);
php > print_r($m);
Array
(
[0] => Array
(
[0] => <AUTH>fail
[1] => AUTH
[2] => fail
)

[1] => Array
(
[0] => <VALIDTO>00.00.0000
[1] => VALIDTO
[2] => 00.00.0000
)

)

KP

Carsten Wiedmann

unread,
Mar 8, 2011, 10:49:36 AM3/8/11
to
Am 08.03.2011 14:46, schrieb Frank Kirschner:
> Ich möchte folgende Zeichenkette zerlegen und in ein Array schreiben
> (Jede Zeile endet mit [CR][LF])
>
> <AUTH>fail
> <VALIDTO>00.00.0000
>
> und den Array dann so auslesen:
>
> echo $arr[AUTH]; ---> Ausgabe: fail
> echo $arr[VALIDTO]; ---> Ausgabe: 00.00.0000

Wie Karl würde ich da PCRE nehmen:
| $string = "<AUTH>fail\r\n<VALIDTO>00.00.0000\r\n";
| if (preg_match_all('/(<.+>)(.*)\r\n/',
| $string, $matches, PREG_PATTERN_ORDER)) {
| $matches = array_combine($matches[1], $matches[2]);
| } else {
| $matches = array();
| }
| var_dump($matches);

Ergebnis:
| array(2) {
| ["<AUTH>"]=>
| string(4) "fail"
| ["<VALIDTO>"]=>
| string(10) "00.00.0000"
| }
Gruß,
Carsten

Carsten Wiedmann

unread,
Mar 8, 2011, 11:00:36 AM3/8/11
to
Am 08.03.2011 14:46, schrieb Frank Kirschner:
> Ich möchte folgende Zeichenkette zerlegen und in ein Array schreiben
> (Jede Zeile endet mit [CR][LF])
>
> <AUTH>fail
> <VALIDTO>00.00.0000
>
> und den Array dann so auslesen:
>
> echo $arr[AUTH]; ---> Ausgabe: fail
> echo $arr[VALIDTO]; ---> Ausgabe: 00.00.0000

Wie Karl würde ich da PCRE nehmen:


| $string = "<AUTH>fail\r\n<VALIDTO>00.00.0000\r\n";

| if (preg_match_all('/<(.+)>(.*)\r\n/',

Ethan Sharps

unread,
Mar 8, 2011, 11:11:06 AM3/8/11
to
Am 08.03.2011 14:46, schrieb Frank Kirschner:
> Hallo,
>
> Ich möchte folgende Zeichenkette zerlegen und in ein Array schreiben
> (Jede Zeile endet mit [CR][LF])
>
> <AUTH>fail
> <VALIDTO>00.00.0000
>
> und den Array dann so auslesen:
>
> echo $arr[AUTH]; ---> Ausgabe: fail
> echo $arr[VALIDTO]; ---> Ausgabe: 00.00.0000

Du meinst evtl: echo $arr['AUTH']

Das Ist einfach. Ich würde es gleich von Arrayobject ableiten:

class MyDictionary extends ArrayObject
{

public function __construct($dataString=null)
{
parent::__construct();
if (empty($dataString)) return;
if (!\preg_match_all("#^<([a-zA-Z]+)>(.+)$#m", $dataString,
$matches))
return;
for ($i = 0; $i < \count($matches[0]); ++$i)
{
$this[$matches[1][$i]] = $matches[2][$i];
}
}

public function __toString()
{
$result = '';
$i = 0;
foreach ($this as $key=>$value)
{
if ($i > 0) $result .= "\n";
else ++$i;
$result .= \sprintf('<%s>%s', $key, $value);
}
return $result;
}

}

$testStr = "<AUTH>fail
<VALIDTO>00.00.0000";

$data = new \MyDictionary($testStr);
$data['BLUB'] = 'A Value :-)';

echo $data;

0liver '0lzo' Seyfert

unread,
Mar 8, 2011, 12:01:27 PM3/8/11
to
Am Tue, 08 Mar 2011 14:46:12 +0100 schrieb Frank Kirschner:
...

Sting in ein Array zerlegen?

$ar[0] = 'Gordon';
$ar[1] = 'Matthew';
$ar[2] = 'Thomas';
$ar[3] = 'Sumner';

SCNR ;)

> Ich möchte folgende Zeichenkette zerlegen und in ein Array schreiben
> (Jede Zeile endet mit [CR][LF])

[$text = ...]
> <AUTH>fail
> <VALIDTO>00.00.0000

Ohne reg. expr. geht s auch so:

$ar1 = split( "\r\n", $text);
foreach($ar1 as $zl1) {
$hpos = str_pos( $zl1, '>');
$hvar = substr( $zl1, 1, $hpos-2);
$hval = trim(substr( $zl1, $hpos+1));
$arr[$hvar] = $hval;
}

> und den Array dann so auslesen:
>
> echo $arr[AUTH]; ---> Ausgabe: fail
> echo $arr[VALIDTO]; ---> Ausgabe: 00.00.0000

Genau, danach ist dann
$arr['AUTH']='fail' und $arr['VALITO']='00.00.000';

:-)
Oliver

Frank Kirschner

unread,
Mar 9, 2011, 2:47:06 AM3/9/11
to

Klasse, genau so habe ich das gesucht. Auch die anderen Ansätze sind
sehr elegant. Vielen Dank für die Hilfe.

lg
Frank

Frank Kirschner

unread,
Mar 9, 2011, 6:10:40 AM3/9/11
to

Ist zwar jetzt offtopic:

Der zur zerlegende String stammt von einer mit curl ausgelesenen
Website: http://track.tof.de/cgi-bin/deutsch/benlogin.cgi

Gebe ich diesen String mit 'echo' aus, sehe ich im Quellcode die
Zeilenumbrüche mit [CR][LF]. Warum funktioniert der reguläre Ausdruck
dann nicht? Wird der String wie im Beispiel mit \r\n vorgegeben geht es.
Wo ist der Unterschied?

lg
Frank


Karl Pflästerer

unread,
Mar 9, 2011, 6:50:25 AM3/9/11
to
Frank Kirschner <147...@celebrate.de> writes:

Irgendwo konvertierst du:

curl -s 'http://track.tof.de/cgi-bin/deutsch/benlogin.cgi'| od -c
0000000 < A U T H > f a i l \n < V A L I
0000020 D T O > 0 0 . 0 0 . 0 0 0 0 \n
0000037

Da ist auch kein \r\n sondern nur ein \n

Je nachdem, was du übergibst, genügst auch ein file_get_contents().

php -r 'preg_match_all("~<([^>]+)>(.*)~m", file_get_contents("http://track.tof.de/cgi-bin/deutsch/benlogin.cgi"), $m); print_r($m);'


Array
(
[0] => Array
(
[0] => <AUTH>fail

[1] => <VALIDTO>00.00.0000
)

[1] => Array
(
[0] => AUTH
[1] => VALIDTO
)

[2] => Array
(
[0] => fail
[1] => 00.00.0000
)

)

KP

Matthias P. Wuerfl

unread,
Mar 9, 2011, 8:33:18 AM3/9/11
to
Es schrieb Frank Kirschner:

> <AUTH>fail
> <VALIDTO>00.00.0000

Und was soll bei

<VERGLEICH> 2 > 1
<ZWEI>EINS> wahr

kommen?

Grüße, Matthias

Frank Kirschner

unread,
Mar 9, 2011, 9:01:29 AM3/9/11
to

Ich übergebe noch ein paar Login Parameter. Aber so wie Du es
beschrieben hast, funktioniert es PERFEKT !!!!
Vielen Vielen Dank!

lg
Frank

0 new messages