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
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
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
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/',
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;
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
Klasse, genau so habe ich das gesucht. Auch die anderen Ansätze sind
sehr elegant. Vielen Dank für die Hilfe.
lg
Frank
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
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
> <AUTH>fail
> <VALIDTO>00.00.0000
Und was soll bei
<VERGLEICH> 2 > 1
<ZWEI>EINS> wahr
kommen?
Grüße, Matthias
Ich übergebe noch ein paar Login Parameter. Aber so wie Du es
beschrieben hast, funktioniert es PERFEKT !!!!
Vielen Vielen Dank!
lg
Frank