PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : regular expressions



ohcibi
02-03-2005, 18:55
ich ma wieder...

helft mir ma bitte schnell auf die spruenge:



preg_match("!\|[a-z0-9]+\|!im",$str);


ich suche also ne beliebige zeichenkette mit buchstaben und/oder zaehlen eingeschlossen in hochstriche... jetz soll der aber



|toplevel|


nich finden... haut irgendwie nich so hin wie ich mir das vorstelle....

Pingu
03-03-2005, 06:31
Soll das gesuchte in $str auftauschen oder prüfst Du nur auf wahr oder falsch. Denn wenn es in $str auftauchen soll, hast Du vergessen mit anzugeben was auftauchen soll:

preg_match("!\|([a-z0-9]+)\|!i",$str);
Außerdem wozu Du den Modifier m brauchst, verstehe ich auch nicht.

Pingu

undefined
06-03-2005, 20:31
Wenn er größere Textpassagen durchsucht ist multiline schon richtig.

ohcibi
14-03-2005, 18:18
danke @undefined...... pingu du musst dir angewoehnen zu beruecksichtigen, dass scripte auch ueber den umfang des hier vorgestellten hinausgehen koennen... aber zu deiner frage:

es handelt sich tatsaechlich nur um große zeichenketten, in denen mehrmals dieses muster auftaucht, sollte aber lediglich |toplevel| (also eine bestimmte zeichenkette) auftauchen, so soll er darauf nicht anspringen.... einzelne zeichen zu negieren bekommt man ja hin, aber wenn ich das mit zeichenketten auf die selbe weise probiere hat es nicht funktioniert.. ich formuliers ma so:



<?php
$str = preg_replace("!\|[a-z0-9]+\|!im","",$str);
?>


|toplevel| soll jetzt NICHT ersetzt werden.... und dass es nich im suchmuster steht, liegt daran, dass ich hier erfragen will wie ich es einbauen muss dass es nicht ersetzt wird

Pingu
14-03-2005, 19:14
danke @undefined...... pingu du musst dir angewoehnen zu beruecksichtigen, dass scripte auch ueber den umfang des hier vorgestellten hinausgehen koennen...Das ist mir schon klar. Deswegen auch meine Gegenfrage. Weil aus den gegebenen Informationen konnte ich nicht auf alles schließen.

Leider ist mir jetzt auch erst bei nochmaligen lesens aufgefallen, daß da wiedermal das kleine Wörtchen "nicht" verborgen war. Welches ich leider gerne immer wieder übersehe ;-)

Ich weiß ja nicht wofür Du es brauchst. Aber ich hatte mal ein ähnliches Problem als ich mir meine Sessions noch selber gebaut habe. Ich mußte alle Links, die nicht auf externe Adressen verweisen, entsprechend um eine Kennung erweitern. Also entsprechend alle Links ersetzen, die ein bestimmtes Keyword nicht enthalten. Nach etwas Suche bin ich auf folgendes gestossen:

$search = array();
$search[0] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^#]*?)\\?([^#]*?)(\"|')/i";
$search[1] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^?#]*?)(\"|')/i";
$search[2] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^#]*?)\\?([^#]*?)#(.*?)(\"|')/i";
$search[3] = "/(href|src)=(\"|')(?!javascript:|http:|ftp:|mailto:)([^?#]*?)#(.*?)(\"|')/i";
$search[4] = "/<form(.*?)>/i";

Das "nicht" wird durch die Kombination "?!" erreicht. In Deinem Fall würde ich folgendes versuchen (natürlich müssen jetzt die Ausrufezeichen ersetzt werden, wenn es innerhalb der Suche nicht escaped werden soll - außerdem wegen den doppelten Anführungszeichen muß AFAIK alles doppelt escaped werden, damit bei der Regex auch alles richtig ankommt):


$str = preg_replace("/\\|(?!toplevel)\\|/im","",$str);

oder

$str = preg_replace('/\|(?!toplevel)\|/im',"",$str);


Pingu

EDIT: siehe auch Kapitel Assertions: http://de2.php.net/manual/en/reference.pcre.pattern.syntax.php#regexp.reference .assertions

ohcibi
14-03-2005, 19:26
$str = preg_replace("/\\|(?!toplevel)\\|/im","",$str);

oder

$str = preg_replace('/\|(?!toplevel)\|/im',"",$str);


okay soweit so gut... und wenn ich jetz das [a-z0-9] noch mit reinbaue haut das hin meenste? weil es duerfen natuerlich nur buchstaben und zahlen zwischen den hochstrichen vorkommen......

ich weiß gar nich mehr wieso ich das brauche, ich hab das dann irgendwie anderes geloest, und den thread hier vergessen, die benachrichtigung is irgendwie ausgewesen 8-)

Pingu
14-03-2005, 21:29
okay soweit so gut... und wenn ich jetz das [a-z0-9] noch mit reinbaue haut das hin meenste? weil es duerfen natuerlich nur buchstaben und zahlen zwischen den hochstrichen vorkommen......
Also ich bin kein Held, soll heißen ich kein Regex-Experte. Soll heißen: ich weiß es nicht. Deshalb würde ich an der Stelle einfach einen zweistufigen Prozess machen, d. h. zuerst alles illegale rausschmeisen und dann nach dem eigentlichen suchen, z.B.:

$str = preg_replace("/\\|(?!toplevel)\\|/im","-test-",preg_replace("/(\\|[^a-z0-9]+\\|)/im", ""$str));
Wobei dies das Problem hat, daß so etwas nicht auf folgendes funktioniert:
dhj45|kjhfjkh4345kj|jflewrh rhthlh54%§§$$|keljhrt4374|kf4
Denn die erste Ersetzung würde daraus folgendes produzieren:
dhj45|kjhfjkh4345kjkeljhrt4374|kf4
Die zweite Ersetzung würde folgendes machen:
dhj45|-test-|kf4

Alternativ könnte man die Ersetzung auch folgendermaßen machen (siehe geänderte Klammerung):
$str = preg_replace("/\\|(?!toplevel)\\|/im","-test-",preg_replace("/\\(|[^a-z0-9]+)\\|/im", ""$str));
Das würde aus obiger Eingabe folgendes in der ersten Ersetzung produzieren:
dhj45|kjhfjkh4345kj||keljhrt4374|kf4
Der zweite Schritt führt dann zu:
dhj45|-test-||-test-|kf4

Pingu

undefined
15-03-2005, 15:22
@ohcibi
Du hast ein Verständnis Problem ;)
Du mußt erst das Suchen was paßt und dann kannst du hingehen und mit einem Lookbehind auf die Treffer eine Auskrenzung machen.

echo preg_replace( "/\|[\w\d]+(?<!toplevel)\|/i", "###", $string );
mfg undefined