REGEX, wie so oft ^^ !

Dimenson

Erfahrenes Mitglied
Hi Leute,

ich habe hier so ne text Datei :

Channel Location State Application(Data)
SIP/225-081cda38 (None) Up Bridged Call(OSS/dsp)
OSS/dsp s@macro-sip_call:1 Up Dial(SIP/225|30|rtT)

Jetzt wollte ich jede zeile nach folgenden Muster durchsuchen und auslesen :

"SIP/225" wobei die 225 nicht immer zutrifft, aber immer 3 stellig bleibt.

Ich bin nun soweit, das ich die Blöcke :
SIP/225-081cda38
Dial(SIP/225|30|rtT)
erstmal ausgefiltert habe.

Jetzt habe ich per Regex nen bissel rumprobiert, es haut aber ned hin.

Hier meine Regex Idee :
PHP:
preg_match('#SIP/(?:(?P<callerid>\d+)-)S$#', $zeichenkette, $treffer, PREG_OFFSET_CAPTURE);
Hoffe ihr könnt mir weiterhelfen, sitze schon 2 std oder so dran, das nervt nen bisschen. Vor allen Dingen kriege ich Regex nie richtig inne Birne. Danke ertsmal.
 
PHP:
$str = "SIP/225";

if(preg_match("#SIP/\d{3}#", $str))	{
	echo "JUHU";
}

Wenns immer SIP/ + 3 Stellige Zahl ist, sollte das greifen.
 
ok, bei der 3.Zeile bringt mir nun das entsprechende Ergebnis.
Also in der Zeile :
OSS/dsp s@macro-sip_call:1 Up Dial(SIP/225|30|rtT)

klappt es, das Ergebnis ist : SIP/225 .
So wollte ich das ja auch, aber leider klappt es nicht mit der Zeile :
SIP/225-081cda38 (None) Up Bridged Call(OSS/dsp)

Ich poste mal mein ganzes Script hier rein :

PHP:
<?php
$handle=file("calllist.txt");
$trenn=explode("  ",$handle[2]);

$call_list=array();

foreach($trenn as $a) {
if (!empty($a)) $call_list[]=$a;
}

foreach($call_list as $komm_r) {
echo $komm_r;
echo "<br>";

$suchmuster="#SIP/\d{3}#";
if (eregi($suchmuster,$komm_r)) echo "klappt doch!";
preg_match($suchmuster, $komm_r, $treffer,PREG_OFFSET_CAPTURE, 3);

foreach($treffer as $b) {
echo $b[0];
}

}

?>


Also mit dem Script teste ich des nur.
Und mit
PHP:
$trenn=explode("  ",$handle[2]);
wechsle ich die Zeilen.
 
Zuletzt bearbeitet:
Merkwürdig:

PHP:
	$str[0] = "OSS/dsp s@macro-sip_call:1 Up Dial(SIP/225|30|rtT)";
	$str[1] = "SIP/225-081cda38 (None) Up Bridged Call(OSS/dsp)";
	$str[2] = "SIP/883";

	if(eregi("#SIP/\d{3}#", $str[1])) echo "JUHU eregi";
	if(preg_match("#SIP/\d{3}#", $str[1])) echo "JUHU preg_match";

preg_match findet in jedem String eine Übereinstimmung, während eregi mit keinem String etwas anfangen kann.

Ich würde dir aber sowieso empfehlen preg_match zu benutzen:

http://de.php.net/manual/de/function.ereg.php hat gesagt.:
Anmerkung: Die Funktion preg_match(), die eine zu Perl kompatible Syntax regulärer Ausdrücke verwendet, ist häufig die schnellere Alternative zu ereg().

Edit:
Noch ein Zitat von der selben Seite:
Save yourself some headache and time, don't use the \d (digits) \w (alphanumeric) and \s (whitespace) short forms. Not only do they make the code less readable, they don't seem to work with ereg.

Edit2:
So frisch aus der Pause zurück noch ein wenig rumprobiert. Bei eregi kannst du die # als Regex-Delimiter weglassen. Ausserdem musst du \d durch [0-9] ersetzen.
PHP:
$suchmuster_ereg="SIP/[0-9]{3}";
$suchmuster_preg="#SIP/\d{3}#";
if (eregi($suchmuster_ereg,$komm_r)) echo "klappt doch!";
preg_match($suchmuster_preg, $komm_r, $treffer,PREG_OFFSET_CAPTURE, 3);

So sollte das funktionieren. Aber ein if(preg_match()) ist eher zu empfehlen, da einige Male darauf hingewiesen wird, dass preg_match() "much faster" ist.
 
Zuletzt bearbeitet:
Zurück