Reguläre Ausdrücke

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Reguläre Ausdrücke

Beitrag von fanrpg »

Wäre jemand so lieb und könnte mir einen regulären Ausdruck basteln für eine preg_replace Funktion? :oops:

Überall wo * ist soll gesucht werden der Rest ist fest.

Code: Alles auswählen

<!-- BEGIN * -->
*
<!-- END * -->
Bis ich die regulären Ausdrücke kann, dauert es noch Jahre.
Habs zwar schon selber versucht aber gescheites rausgekommen ist nichts ausser solche Fehlermeldungen:

Code: Alles auswählen

Warning: preg_replace(): Unknown modifier '#'
Also ich habs so versucht:

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN #(*?)# -->#(*?)#<!-- END #(*?)# -->', '', $code);
und so:

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN (*?) -->(*?)<!-- END (*?) -->', '', $code);
und so auch mal...

Code: Alles auswählen

$code = preg_replace('<!-- BEGIN [a-z~0-9] -->[a-z~0-9]<!-- END [a-z~0-9] -->', '', $code);
Aber was gescheites kam nicht raus :oops:
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Re: Reguläre Ausdrücke

Beitrag von Banger »

fanrpg hat geschrieben:Wäre jemand so lieb und könnte mir einen regulären Ausdruck basteln für eine preg_replace Funktion? :oops:

Überall wo * ist soll gesucht werden der Rest ist fest.
Was hast Du überhaupt vor? Willst Du den entsprechenden Block komplett rausschmeißen oder durch etwas bestimmtes ersetzen oder gar den Block haben?

Für beide Varianten (Ersetzen und Suchen): probier's mal hiermit:

Code: Alles auswählen

<?php
$cnt = 'das soll <!-- BEGIN Laber -->nicht<!-- END Laber -->stehen bleiben';

echo preg_replace('/<!-- BEGIN (\w+) -->.*<!-- END \1 -->/Us', '', $cnt),"\n";

preg_match('/<!-- BEGIN (\w+) -->(.*)<!-- END \1 -->/Us', $cnt, $r);
print_r($r);
?>
Das erste Beispiel liefert nur den Text um den Block herum zurück, das zweite Beispiel ein Array mit den Matches:
$r[1] enhält den Blocknamen ('Laber')
$r[2] enthält den Text zwischen den Markern ('nicht')
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Was hast Du überhaupt vor? Willst Du den entsprechenden Block komplett rausschmeißen oder durch etwas bestimmtes ersetzen oder gar den Block haben?
Ich will den Block dann komplett raushaben.

Aber danke :) Dein Code funktioniert.
Mit 3 Tutorials die ich bis jetzt gelesen habe war ich schon so weit =>

Code: Alles auswählen

$code = preg_replace('/<!-- BEGIN .* -->.*<!-- END .* -->/i', '', $code);
Er erzeugte zwar keine Fehlermeldung mehr.. aber weg war der Block mit dem Code aber auch nicht.
Benutzeravatar
Banger
Ehemaliges Teammitglied
Beiträge: 375
Registriert: 03.05.2005 21:53
Wohnort: Düsseldorf
Kontaktdaten:

Beitrag von Banger »

fanrpg hat geschrieben:Mit 3 Tutorials die ich bis jetzt gelesen habe war ich schon so weit =>

Code: Alles auswählen

$code = preg_replace('/<!-- BEGIN .* -->.*<!-- END .* -->/i', '', $code);
Er erzeugte zwar keine Fehlermeldung mehr.. aber weg war der Block mit dem Code aber auch nicht.
Jup, da fehlt der Optionsschalter s, der bewirkt, dass der Punkt auch Zeilenumbrüche erfasst - die ja wahrscheinlich zwischen den beiden Blockmarkern auftreten werden :)
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Danke das hat geholfen mit s funktioniert auch mein Code :)

Ich glaub so langsam versteh ich diese Regulären Ausdrücke.

Habe auch schon den 2. Audruck hingekriegt

Code: Alles auswählen

$this->code = preg_replace('/\{.*\}/i', '', $this->code);
Du bist genial, dank dir :D
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Ich blick da gerade was voll nicht... zum testen wolle ich mal schauen ob ich auch BBCode jetzt hinkriege..

aber irgendwie fühl ich mich gerade irgendwie verarscht..

hier mal die Datei:

Code: Alles auswählen

<?php

$string = 'Dies ist ein [b]einfacher[/b] Test[br] Alles was hier steht [i]muss[/i] [color=#FFFFFF]WEG[/color] [url=http://www.fanrpg.com]Link auf fanrpg.com[/url] [url]http://www.fanrpg.com[/url] <> <>';

function add_bbcode($str)
{
	if( $str )
	{
		// [b] BBCode
		$str = preg_replace('/[{1}b]{1}.*?[{1}\/b]{1}/is', '<strong>$1</strong>', $str);
		
		// [br] BBCode
		$str = str_replace('[{1}br]{1}', "\r\n", $str);
		
		// [i] BBCode
		$str = preg_replace('/[{1}i]{1}.*?[{1}\/i]{1}/is', '<i>$1</i>', $str);
		
		// [color:#123456] BBCode
		$str = preg_replace('/[{1}color:{1}(.*?)]{1}(.*?)[{1}\/color]{1}/is', '<span style="color:$1">$2</span>', $str);
		
		// [url] BBCode
		$str = preg_replace('/[{1}url]{1}(.*?)[{1}\/color]{1}/is', '<a href="$1">$1</a>', $str);
		
		// [url=http://....] BBCode
		$str = preg_replace('/[{1}url=(.*?)]{1}(.*?)[{1}\/url]{1}/is', '<a href="$1">$2</a>', $str);
		
		return $str;
	
	}
}

echo add_bbcode($string);		
?>
Aber als Ausgabe kommt nur so nen Quatsch heraus :cry:

Code: Alles auswählen

D<i></i>st e<i></i>st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng><st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng></st<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>ng><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":] A"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":es was h<i><"><">$i<"></a>a>span>i>]m<a h<a href="ef="ss[">$i<"></a>a><i></i><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":] ["></a>"><">$i</a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":=http:"><">$i<"></a>a>span>/www<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":fan"><">$i<"></a>a>span>pg<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":m]"><">$i<"></a>a>span><i></i><a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>] [<a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>]http<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>/www<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":fan"><">$i<"></a>a>span>pg<span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span><span sty<a h<a href="ef="e="">$i<"></a>a>o<a h<a href="ef="">$i<"></a>a><a h<a href="ef=":m["><">$i<"></a>a>span><a h<a href="ef="<span sty">$i<"></a>a>e<a href=""co<a h"></a>ef<a href=""">$i<"></a>a><a h<a href="ef=":"><">$i<"></a>a>span>] <> <>
Und ich versteh irgendwie gerade voll nicht, warum das nicht funktioniert :cry:

Weiss das zufällig einer was ich falsch mache?
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag von MagMo »

Hi,

eins deiner Probleme ist, dass du die eckigen Klammern nicht mit einem Backslash geschütz hast.

Bsp.: [abc] sucht nach einem a, einem b oder einem c, aber NICHT nach der Zeichenfolge [abc] wie du es willst.
\[abc\] such nach der Zeichenfolge [abc], dass ist das was du willst.

Zudem ist es ratsam Replace-Code der / enthält nicht durch / einzugrenzen sondern durch #. Dadurch spart man sich das schützen aller /.

Das ersetzen mit einer gefundenen Zeichenfolge funktioniert nicht mit $1.
Erstens musst du die Zeichenfolge, die eingefügt werden soll, durch runde Klammern definieren. In deinem Fall das .*?.
Zweitens erfolgt das Einfügen mittels \n, wobei n die Nummer der Zeichenfolge ist (die definierten Zeichenfolgen durchzählen bei Eins beginnend). In deinem Fall also mit \1.

Also muss dein i-Replace nicht so aufgebaut sein

Code: Alles auswählen

$str = preg_replace('/[{1}i]{1}(.*?)[{1}\/i]{1}/is', '<i>$1</i>', $str);
sondern so

Code: Alles auswählen

$str = preg_replace('#\[i\](.*?)\[/i\]#is', '<i>\1</i>', $str);
Grüße
MagMo
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Danke, hat bestens funkioniert :D
fanrpg
Mitglied
Beiträge: 2909
Registriert: 13.12.2004 22:41

Beitrag von fanrpg »

Eine kleine Frage hätte ich aber noch.. wie kann man einzelne Zeichen auschliessen?

Ich habe das mit Klassen probiert:

Code: Alles auswählen

$str = preg_replace('/\[url\]([^a-z_+,.#%0-9:\/-])\[\/url\]/is', '[url]\1[/url]', $str); // Secure the [url] Tag!
Dies ist der Eingangs String:

Code: Alles auswählen

$str = "[url]http://www.google.de/index,start,site.html[/url] [url]\" onclick=\"this.location(google.de)\"[/url]";
Demnach ist ja der erste Ja Konform und der 2. Nicht, oder täusche ich mich da?

Trotzdem gibt der beide Tags komplett ohne Änderungen aus :(

Code: Alles auswählen

[url]http://www.google.de/index,start,site.html[/url] [url]" onclick="this.location(google.de)"[/url]
Weiss zufällig jemand was ich wieder falsch mache?
Wäre echt nett :(
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag von MagMo »

Hi,
fanrpg hat geschrieben:

Code: Alles auswählen

$str = preg_replace('/\[url\]([^a-z_+,.#%0-9:\/-])\[\/url\]/is', '[url]\1[/url]', $str); // Secure the [url] Tag!
Was willst du damit bezwecken?
fanrpg hat geschrieben:Demnach ist ja der erste Ja Konform und der 2. Nicht, oder täusche ich mich da?
Weder der eine noch der andere String ergeben für den regulären Ausdruck ein Wahr.

1.) In einem regulären Ausdruck steht der Punkt für jedes beliebige Zeichen, wenn du in einer Auswahl nur den Punkt meinst, dann musst du ihn mit \ schützen also:
. - findet jedes Zeichen
\. - findet nur einen Punkt

2.) Ein ^ als erstes Zeichen in den eckigen Klammern verneinen die Zeichenauflistung, Bsp.:
[^a] - findet jedes Zeichen, dass kein a ist
Dein Code oben (vereinfacht) enthält folgendes: [^.] Unter Berücksichtigung von 1.) und 2.) was willst du damit erreichen?

3.) Dein regulärer Ausdruck sucht genau ein Zeichen (nicht mehr und nicht weniger) zwischen [ url] und [ /url], dass nicht gleich a-z usw. ist. Sind zwischen den url's mehr als ein Zeichen vorhanden, dann wars das schon. Wenn du mehr als ein Zeichen zulassen willst, dann musst du das auch angeben.

Du solltest dich eventuell mal ein bischen in die Materie einlesen. :grin:

Grüße
MagMo
Antworten

Zurück zu „Coding & Technik“