Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Reguläre Ausdrücke(RegEx) Tutorial    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
     Reguläre Ausdrücke(RegEx) Tutorial Zitat | Bearbeiten

Dieses Tutorial erklärt euch den Umgang mit preg_match

Hattet ihr auch schon das Problem, dass ihr einen bestimmten logischen Textteil aus einem großen
Text herausfiltern musstet und ggf. ersetzten und versteht die logik von preg_match / preg_replace / usw. nicht?

Ich erkläre es euch ganz einfach.

Die Zeichen



Zitat:


. entspricht einem beliebigen Zeichen ( also Buchstaben,Zahlen,sonderzeichen,bindestriche,usw.).
+ entspricht anzahl >= 1
.+ entspricht mehreren beliebigen Zeichen
* entspricht anzahl >= 0
.* entspricht kein oder mehrere beliebigen Zeichen
? entspricht einem Zeichen
.? entspricht kein oder ein beliebiges Zeichen
| entspricht der OR bzw. ODER Verknüpfung
^ entspricht zweierlei: einmal der NOT bzw. NICHT Verknüpfung(aber nur in der [] klammer) und anderesmal, dass das folgende zeichen am anfang stehen muss.

alle oben genannten zeichen müssen als echte zeichen mit dem \ maskiert werden, also z.B. \. entspricht dann dem .

\w entspricht einem Buchstabe
\w+ entsprcht mehreren (oder einem) Buchstaben
\d entspricht einer Zahl
\d+ entspricht mehreren (oder einer) Zahlen

() entspricht einer Gruppe, wird also gespeichert. Die Erste Gruppe kann nachher bei preg_replace im replacement als $1 angegeben werden, die zweite als $2 usw.
(\w+) entspricht mehreren gespeicherten Buchstaben
[] entspricht einem Bereich
[a-z] entspricht den kleinen Buchstaben a bis z
[A-Z] entspricht den grossen Buchstaben A bis Z

/ oder # müssen an anfang und ende!


Alle Zeichen, die hier nicht aufgeführt sind, kann man einfach so in den pattern reinschreiben

Beispiele

Gültigkeit einer Email

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
<?php
$email 
"test@testserver.endung";
if(
preg_match("/([0-9a-zA-Z])@(\w+)\.(\w+)/",$email)){ //gesucht wird nach beliebig vielen zeichen von 0 bis 9 a bis z und A-Z denen ein @ folgt.
// Diesem @ folgt eine buchstabenkette mit punkt und noch einer buchstabenkette
    
echo $email;
}else {
    echo 
"nicht gültig";
}
?>


AUSGABE: test@testserver.endung



BBCodes
a)
 PHP 
1:
2:
3:
4:
5:
6:
7:
<?php
$text 
"[b ]fetter Text[/b]";//ohne das leerzeichen bei [b ]
$replace '<b>$1</b>';//bzw
//$replace = '<p style="font-weight:bold;">$1</p>';
$text preg_replace("/\[b\](.*)\[\/b\]/",$replace,$text);
echo 
$text;
?>

AUSGABE: fetter Text

b)
 PHP 
1:
2:
3:
4:
5:
6:
<?php
$text 
"[url =http://www.google.de]Link[/url]";//ohne das leerzeichen bei [url ]
$replace '<a href="$1">$2</a>';// hier ist jetzt das leerlassen von [url=  ]  nicht bedacht
$text preg_replace("/\[url=(.*)\](.*)\[\/url\]/",$replace,$text);
echo 
$text;
?>

AUSGABE: Link
[color=red]
ACHTUNG!: SÄMTLICHE BEISPIELE SOLLTEN noch gegen Design-Zerstörer geschützt werden...[/color]

http://www.regex-tester.de/regex_glossar.html


Erweiterungen folgen bei Bedarf noch

Danke für eure Aufmerksamkeit, und bei Fragen einfach melden

Posten in anderen Foren oder auf der eigenen Website sind okay, solange ich genannt werde.
Änderungen unerwünscht

EDIT1: tipps von B.C. implementiert


Signaturen sind doof

Post wurde schon 22x editiert, das letzte mal am 17.01.2010 um 11:18 von spooooongq
14.01.2010, 20:55 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Hi,

die Dinger am Anfang oder Ende nennt man Delimeter (/ oder #) und wieso hast du
im Zitat beim ersten Absatz nicht einfach das Escapen (maskieren) von Zeichen erklärt? Und ein paar BBCode-Beispiele
würden hier einigen bestimmt auch viel helfen.
Außerdem ist dieses zeichen nicht erklärt: ^
Das ist auch sehr wichtig

Außerdem fehlen die Modifikatoren ...

Edit: Die ganze Scheiße nennt man übrigens Reguläre Ausdrücke (Auch RegEx gennant, Regular Expression, glaube ich...)
Und bitte gehe mal auf die Funktionen preg_replace und preg_match sowie preg_match_all ein,
die haben ja alle große Unterschiede ...




Post wurde schon 2x editiert, das letzte mal am 14.01.2010 um 21:23 von B.C.
14.01.2010, 20:59 Profil | PM | E-Mail  
md5()
Mitglied
Guter User


Dabei seit: 18.12.2009
Herkunft: Ukraine
Posts: 273
      Zitat | Bearbeiten

hey vielen dank...


14.01.2010, 21:36 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

danke B.C. für deine wertvollen Ergänzungen, das mit preg_replace usw. wird nur gemacht, wenn das noch mehr leute nützlich finden...


Signaturen sind doof

Post wurde schon 1x editiert, das letzte mal am 15.01.2010 um 17:10 von spooooongq
15.01.2010, 17:10 Profil | PM | E-Mail  
yoshi-
Mitglied
Guter User


Dabei seit: 29.07.2009
Herkunft: keine Angabe
Posts: 374
      Zitat | Bearbeiten

[url=javascript:alert(/XSS/.source);]Link[/url]
und schon eine xss lücke




Post wurde schon 1x editiert, das letzte mal am 15.01.2010 um 21:49 von yoshi-
15.01.2010, 21:49 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

Danke yoshi- für deinen sinnvollen und mehrmalsdurchdachten beitrag.

Es ist ein Tutorial für RegEx und nicht für BBCodes, die Fehler haben...
Ich finde es aber nett, dass du die Leser meines Tutorials auf solche fehler aufmerksam machst


Signaturen sind doof

Post wurde schon 2x editiert, das letzte mal am 16.01.2010 um 02:11 von spooooongq
16.01.2010, 02:10 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Zitat:
Orginal von B.C.

Außerdem fehlen die Modifikatoren ...


Ich vermisse meine Modifikatoren =(


Zitat:
Original von spooooongq

^ entspricht der NOT bzw. NICHT Verknüpfung


Wo haste den Scheiß denn her? Das stimmt nur im Zusammenhang mit einer bestimmten Klammer...
Dieses Zeichen macht klar, dass der Ausdruck bzw. die darauffolgenden Zeichen am Anfang vorkommen müssen!


17.01.2010, 00:44 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

danke, aber das mit den modifikatoren kommt erst dann, wenn sich hier noch mehr leute melden, nur für 2, von denen es einer sowieso weiß, mach ich das nicht.


Signaturen sind doof
17.01.2010, 11:17 Profil | PM | E-Mail  
B.C.
Mitglied
Sehr guter User


Dabei seit: 04.02.2009
Herkunft: Niedersachsen
Posts: 797
      Zitat | Bearbeiten

Nö ich denke, dass du einfach keine Ahnung hast, was Modifikatoren sind
Die sind bei allen RegEx sehr wichtig!

Mofidikatoren stehen am Ende (hinter den letzten Delimeter) und beeinflussen das gesamte Verhalten
des reglären Ausdrucks. Die wichtigsten in der Übersicht:

i -> Der reguläre Ausdruck wird non-case sensitive, d.h. er ignoriert groß- und kleinschreibung (brauch man eig immer )

s -> ignoriert Zeilenumbrüche, denn sonst würde er nur auf eine Zeile suchen.

einsatz zB so:

 PHP 
1:
2:
<?
preg_replace
('/TEXT/si'''$text);


Würde Text oder text aba auch TEXt rauslöschen...




Post wurde schon 1x editiert, das letzte mal am 17.01.2010 um 13:52 von B.C.
17.01.2010, 13:51 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

ok ich hab keine ahnung, werde mich aber noch damit befassen, wenn du das in DEINEM tutorial haben willst, machs rein, und hör auf mich zu nerven


Signaturen sind doof
17.01.2010, 18:30 Profil | PM | E-Mail  
md5()
Mitglied
Guter User


Dabei seit: 18.12.2009
Herkunft: Ukraine
Posts: 273
      Zitat | Bearbeiten

Hi
Ich habe mir dein Tuto. angeguckt und hat mir sehr gefallen aber ich jedoch nicht klar:
 PHP 
1:
2:
3:
4:
if (preg_match("/[a-zA-Z]+[0-9]/",$_SERVER['HTTP_USER_AGENT']))
{
    echo "hi";
}


ich mochte den Browser des Users herausfinden
also zuerst der name [a-zA-z] und die version [0-9]
geht aber nicht kannste helfen ?


21.01.2010, 00:12 Profil | PM | E-Mail  
Darien
Mitglied
Sehr guter User


Dabei seit: 12.09.2008
Herkunft: Austria
Posts: 505
      Zitat | Bearbeiten

Zitat:
Orginal von spooooongq
ok ich hab keine ahnung, werde mich aber noch damit befassen, wenn du das in DEINEM tutorial haben willst, machs rein, und hör auf mich zu nerven


Wenn du schon ein Tut für Leute reinstellst die weniger Ahnung haben, solltest du zumindest auf die hören die Sie haben.
Solch ne Aussage erwartet man von nem kleinen Kind.
Also entweder ganz und sauber oder gar nicht.^^

LG
Patrick


21.01.2010, 13:11 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

@md5(): das problem ist, dass du einem server jeden beliebigen Usersagent senden kannst, und da die version herauszufinden, ist es einfacher, nach "opera","firefox" und internetexplorer zu suchen

als lösung könnte ich mal sowas vorschlagen:
 PHP 
1:
2:
3:
$pos = strpos($_SERVER['HTTP_USER_AGENT']," ");
$substr = substr($_SERVER['HTTP_USER_AGENT'],0,$pos);
echo preg_replace("/(\w+)\/([0-9]\.[0-9]*)/","Browser:$1     Version:$2",$substr);


wobei er jetzt aber beim internetexplorer ebenfalls
"Browser:Mozilla angibt"


Signaturen sind doof
21.01.2010, 19:48 Profil | PM | E-Mail  
spooooongq
Mitglied
Sehr guter User


Dabei seit: 27.02.2009
Herkunft:
Posts: 803
      Zitat | Bearbeiten

Zitat:
Orginal von Darien
Zitat:
Orginal von spooooongq
ok ich hab keine ahnung, werde mich aber noch damit befassen, wenn du das in DEINEM tutorial haben willst, machs rein, und hör auf mich zu nerven


Wenn du schon ein Tut für Leute reinstellst die weniger Ahnung haben, solltest du zumindest auf die hören die Sie haben.
Solch ne Aussage erwartet man von nem kleinen Kind.
Also entweder ganz und sauber oder gar nicht.^^

LG
Patrick


L O L

ich hab gesagt ich machs, aber wenn sich nur 4 leute melden, mach ich mir die arbeit nich...


Signaturen sind doof
21.01.2010, 19:50 Profil | PM | E-Mail  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

http://de2.php.net/manual/de/function.preg-quote.php

Sollte ebenso noch weiter helfen. Im Übrigen gibt es für viele Zeichenfolgen schon bestimmte kurz Ausdrücke wie \w, \d und \s


10.02.2010, 11:44 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
      Zitat | Bearbeiten

Ich finde das passt hier am besten rein:

Kann mir wer erklären wie ich hier den Inhalt zwischen den <tr> Tags bekomme?

 PHP 
1:
2:
3:
4:
5:
6:

<tr class="tablelist-odd">
<td> Hier was Text mit <a href="google.de">einem Link.</a><br>
Und hier noch so Tags wie <h1>und </h1> <h3>solche</h3>hier.
<td> Andere Zelle </td>
</tr>


Also so das ich
 PHP 
1:
2:
3:
4:

<td> Hier was Text mit <a href="google.de">einem Link.</a><br>
Und hier noch so Tags wie <h1>und </h1> <h3>solche</h3>hier.
<td> Andere Zelle </td>


bekomme.

Würde mich freuen wenn mir da wer weiter helfen könnte ^^

DingsDaBums


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
05.12.2010, 01:17 Profil | PM | E-Mail  
Mogria
Mitglied
Sehr guter User


Dabei seit: 30.04.2010
Herkunft: Schweiz
Posts: 614
      Zitat | Bearbeiten

Zitat:
<tr[^>]*?>(.*?)</tr>

Sollte gehen.
Du solltest einen anderen Begrenzer als / verwenden z.B. # und ausserdem noch die modifier "m", "s" und "i" mitgeben


05.12.2010, 01:34 Profil | PM | E-Mail  
DingsDaBums
Mitglied
Exzellenter User


Dabei seit: 12.09.2010
Herkunft: keine Angabe
Posts: 2496
      Zitat | Bearbeiten

Ok vielen dank =)


Schau mal bei meinem Projekt vorbei. Vielleicht ist das ja was für dich MyStartPanel - Deine persönliche Startseite mit deinen Favoriten
Auf der Suche nach einem guten Vokabeltrainer? Vokabeltrainer Cramfire - Schnell und effektiv Vokabeln lernen
05.12.2010, 13:16 Profil | PM | E-Mail  
Eiermann
Mitglied
Aktiver User


Dabei seit: 03.04.2010
Herkunft:
Posts: 189
      Zitat | Bearbeiten

\w filtert Zeichen nach angegeben "locale" sprich "Europe/Germany" filtert auch ßÄäöÖüÜ, das sollte man noch dazu schreiben x)


13.12.2010, 19:32 Profil | PM | E-Mail  
Akira-sama
Mitglied
Anfänger


Dabei seit: 23.11.2010
Herkunft:
Posts: 31
      Zitat | Bearbeiten

Hi ich hätte hierzu mal eine Frage:

Und zwar wie filtert man Leerzeichen heraus? Es soll nur ein Wort sein:

'AkiraSama' richtig
'Akira Sama' falsch

 PHP 
1:
2:
3:
<?php
preg_match
('/^[a-zA-Z0-9]$/','Akira Sama');
?>

Was muss ich da verändern, damit das Wort mit Leerzeichen nicht durchkommt?


22.12.2010, 22:49 Profil | PM | E-Mail  
pyr
Mitglied
Gruenling


Dabei seit: 08.04.2010
Herkunft: keine Angabe
Posts: 23
      Zitat | Bearbeiten

 PHP 
1:
2:
3:
4:
5:
6:
7:
8:

<?php
if (!preg_match'/ /''Akira Sama') {
echo 
"braves Hündchen :)";
} else {
echo 
"dududu!";
}
?>



23.12.2010, 13:53 Profil | PM | E-Mail  
Teralios
Moderator
Perfekter User


Dabei seit: 18.09.2005
Herkunft: Berlin
Posts: 2542
      Zitat | Bearbeiten

http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck

Die Seite ist eigentlich ja eine Erklärung, was Reguläre Ausdrücke sind, aber auch gut als Tutorial geeignet.


28.12.2010, 09:52 Profil | PM | E-Mail  
Ma27
Mitglied
Anfänger


Dabei seit: 01.03.2013
Herkunft: München
Posts: 49
      Zitat | Bearbeiten

Danke für das Tut.
So was hab ich gesucht!!

zu XSS: es wäre angebracht, eine Lösung dafür zu posten, da nicht jeder sich so gut damit auskennt, wie du.

Lg Ma27


LG Ma27



Post wurde schon 2x editiert, das letzte mal am 08.07.2013 um 19:51 von Ma27
08.04.2013, 13:48 Profil | PM | E-Mail  
CityHunter
Mitglied
Neuling


Dabei seit: 29.03.2014
Herkunft: Berlin
Posts: 8
      Zitat | Bearbeiten

Hallo,

ich will ein bbcode bauen aber irgend wie klappt meine Funktion nicht mit preg_replace

kann mir vielleicht einer weiter helfen?


 PHP 
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

<?php

function ubb ($message)
{
    
$message preg_replace("/\[b\](.*)\[\/b\]/si","<b>$1</b>",$message);
    
    return 
$message;
}
    
$test2 "[b ]Das ist ein Test[/b]";
    
$test ubb($test2);
    echo 
$test;
?>


Mehrere Augen sehen ja besser als zwei. Bedanke mich jetzt schon mal.




Post wurde schon 4x editiert, das letzte mal am 29.03.2014 um 16:02 von CityHunter
29.03.2014, 12:29 Profil | PM | E-Mail  
FalkenaugeMihawk
Mitglied
Perfekter User


Dabei seit: 05.06.2010
Herkunft: Schweiz
Posts: 2619
      Zitat | Bearbeiten

Schau dir Zeile 10 nochmal an. Da ist ein Leerzeichen in [b].


29.03.2014, 21:56 Profil | PM | E-Mail  
Seiten (2):  1  2 
PHP-Support.de » Programmierung » PHP & MySQL » Codeschnipsel » Reguläre Ausdrücke(RegEx) Tutorial   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz