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";
}
?>
<?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]
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.
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
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!
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.
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.
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.^^
@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
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...
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 ^^