RegEx Verständnisfrage

  • Themenstarter Themenstarter antihero
  • Beginndatum Beginndatum
A

antihero

hallo Leute,

ich habe bereits einmal einen kleinen Beitrag zu diesem Thema geschrieben, mit der Frage nach einer RegEx Erklärung (Reguläre Ausdrücke, Regular Expresions). Ich habe darauf ein paar Links, etc. bekommen und die ganzen Tutorials auch durchgelesen, aber irgendwie happerts immer noch ein wenig beim Verständnis. Ich wäre euch dankbar, wenn jemand eine Erklärung zu den RegEx's im eigenen Wortlaut hier wiedergeben könnte. Ich habe auch schon ein paar Beispiele kopiert und dann selber editiert, und das funktioniert. Aber selber schreiben kann ichs irgendwie nicht... :(

Kleines Beispiel:
Habe probiert, eine kleine, einfach RegEx Funktion zu machen um [ B ] und [ EB ] durch die Bold Tags zu ersetzen:
PHP:
$output = preg_replace("([B])(*)([EB])","<b>\\2</b>",$string);

:) Ich weiss, ist wahrscheinlich ziemlich lustig, aber irgendwie hab ich das Prinzip noch nciht wirklich geschnallt. Vielen Dank also, für all eure Hilfe.

antihero
 
Code:
$output = preg_replace("=(\[B\]|\[EB\])(.*)(\[B\]|\[EB\])=isU","<b>\\2</b>",$string);
So funktioniert das Ganze ;)

In deinem ersten Teilmuster hast du eine Alternative, entweder soll nach [b] oder [eb] gesucht werden, dass gleiche auch am Ende. Hinter dem Delimiter, hier das Gleichheitszeichen, setzt man noch die Option, dass nicht case-sensitive gesucht werden soll.
 
Jetzt hab ich ein Opfer gefunden... ;-]
Ok, weil ich eben nicht nur Kopieren sondern auch profitieren möchte (sehr schön formuliert) mal konkrete Fragen:

1. Wieso kommt das ganze jetzt zweimal mit einem (.*) zwischendrin?
"(\[B\]|\[EB\])(.*)(\[B\]|\[EB\])"

2. Wieso macht man ein = zeichen vor und nach dem Suchmuster? Macht man das immer? Du nennst das Delimiter, gehen da auch andere Zeichen?
"=(\[B\]|\[EB\])(.*)(\[B\]|\[EB\])=(...)"

3. Was bedeutet "isU" das da nach dem zweiten = kommt? Casesensitiv? Gibt es auch andere Abkürzungen mit anderen bedutungen?
"=(\[B\]|\[EB\])(.*)(\[B\]|\[EB\])=isU"

Vielen Dank für deine Hilfe, ich hoffe ich überfordere dich nicht, hast dann mal ein Bier gut... ;)

antihero
 
-

1. Wieso kommt das ganze jetzt zweimal mit einem (.*) zwischendrin?
Ich denke mal, du meinst, wieso [ b ] und [ eb ] je zweimal auftauchen. Du willst ja die Ersetzung vornehmen, wenn entweder das eine oder das andere vorkommt.

2. Wieso macht man ein = zeichen vor und nach dem Suchmuster? Macht man das immer? Du nennst das Delimiter, gehen da auch andere Zeichen?
Man sollte diese Begrenzungszeichen stets benutzen, dafür sind sie halt vorgesehen. Am häufigsten werden = und / benutzt, da gehen aber auch andere, musst du mal ausprobieren, was PHP so alles durchlässt.

3. Was bedeutet "isU" das da nach dem zweiten = kommt? Casesensitiv? Gibt es auch andere Abkürzungen mit anderen bedutungen?
php.net Link Hier findest du sämtliche Optionen, mit denen du deinen Ausdruck noch modifizieren kannst.

Vielen Dank für deine Hilfe, ich hoffe ich überfordere dich nicht, hast dann mal ein Bier gut...
Dazu gehört mehr, um mich zu überfordern ;-)
 
Ja, überfordern war das falsche Wort... Ich werd dirs mitteilen wenn mir 's richtige in den Sinn kommt... ;)

Kleine Frage noch. Das Script würde in der von dir geposteten Form also den folgenden Ausdruck in Bold tags schreiben?
[ B ]fett gedruckter text[ B ]

Auch fett würde das werden:
[ EB ]fett gedruckter text[ EB ]

Nicht fett bliebe das:
[ B ]fett gedruckter text[ /B ]

Hab ich das so richtig verstanden? Wenn ja, vielen Dank, ich bin der Erleuchtung jetzt schon viel naher... Wenn nein, geh ich jetzt erstmal was essen... :-)

antihero
 
-

Richtig :-)

Aber es wäre ja ein leichtes den Ausdruck so zuschreiben, dass man noch einen Slash in den AbschlussTag setzen muss.
 
Aber es wäre ja ein leichtes den Ausdruck so zuschreiben, dass man noch einen Slash in den AbschlussTag setzen muss.
Mit dieser Schlussfolgerung wäre ich wahrscheinlich auch nicht überfordert gewesen... :-) ;) Mir gings nur darum zu erkennen, was genau hier gemacht wird, da ich dass nun tatsächlich geschafft habe werde ich mal ausprobieren und in die Praxis umsetzten...
Vielen Dank nochmals, ich denke deine Ausführungen haben mir die Tür zur Welt der regulären Ausdrücke geöffnet... (Ich sollte Poet werden... Stattdessen programmiere ich :()

antihero
 
der delimiter oda wie mann das nennt kann jedes xbelibige alphanummerische zeichen sein ausser dem \ (Backslash)

greetz

//edit: und mit dem sollte
{B}text{/BE}
{B}text{/B}
{BE}text{/BE}
{BE}text{/BE}

gehn (natürlich sind statt { [ zu verwenden ;)
<?php
$string = preg_replace("!(\[b\]|\[be\])(.*)(\[/b\]|\[/be\])!mi", "<b>$2</b>", $string);
?>
 
Zuletzt bearbeitet:
Original geschrieben von [23]^5^
der delimiter oda wie mann das nennt kann jedes xbelibige alphanummerische zeichen sein ausser dem \ (Backslash)
...
Es sollte auch mit Backslash gehen. Allerdings hat man dann enorme Probleme wenn man wirklich eine braucht. Dann hat man schnell sowas \\\\\ im Ausdruck und das ist einfach nur verwirrend ;).
Gerne genommen wird auch das ° Zeichen, da man das fast nie braucht und somit nicht mit \° angeben müsste.
 
wenn caminus alles weiß, kann er ja vielleicht auch mein problem, dass ich schon ewig hab, lösen. erst mal code...

PHP:
<?
function bla($string){
  $string .= "a";
  return $string;
}

$text = "hallo <lalala>";
$text = preg_replace("/\<(.*?)\>/","<".bla("$1").">",$text);
echo $text;
?>

also. der code soll aus "hallo <lalala>" -> "hallo <lalalaa>" machen. ist jetzt zwar ein dummes beispiel und ich weiss auch nicht ob < und > escaped werden müssen, ich habs einfach mal gemacht, aber darum gehts ja gar nicht. es geht viel mehr darum, dass bei mir wenn ich so einen code benutz nie etwas in der funktion ankommt. wie kann ich also der funktion was aus der klammer übergeben?
 
Zurück