Regulärer Ausdruck
*jiriki*
- php
0 Skeeve0 seth
0 Daniel (nun registriert)1 globe
Hi Leute,
Ich möchte in meinem selbstgeschriebenen CMS meiner Page die Möglichkeit haben, eigene Tags zu setzen, die in eckige Klammern gesetzt werden à la [i] und [/i].
Mein entsprechender Regexp in PHP, der mir alle Tags paarweise rausfiltern soll, sieht nun so aus:
/([i])([^([|])]*)([/i])/
Ist jetzt speziell für die i-Tags. Da ich mir irgendne Seite ausm Netz zu RegExp angeschaut hab, ohne Vorkenntnisse, würd ich gern mal wissen, ob der Ausdruck auch kürzer oder präziser formulierbar ist.
Als Funktion hatte ich mir preg_match_all auserkoren, dass mir dann die Einzelnen Tags in nem Array abspeichert.
Grüßle, *jiriki*
Moin!
/([i])([^([|])]*)([/i])/
Der matcht aber nicht z.B. [i]tralllala [u]hoppsassa[/u][/i]. Ich gehe mal davon aus, daß Du mehr als nur [i] supporten wirst.
Schau Dich mal um über die Forensuche. Letztens gab es schon mal eine Diskussion dazu. Vielleicht 'ne Woche her. Mit regulären Ausdrücken kommst Du nicht allzu weit, wenn Du Verschachtelungen beachten willst. Da müßtest Du schon richtig parsen (ein Beispiel hatte ich gepostet)
Andererseits: Wozu!? Vielleicht reicht es Dir ja einfach zu ersetzen?
s/[(/?)(u|i|b)]/<$1$2>/g (das ist jetzt Perl Syntax. PHP Syntax kenne ich nicht.)
-- Skeeve
gudn tach!
s/[(/?)(u|i|b)]/<$1$2>/g (das ist jetzt Perl Syntax. PHP Syntax kenne ich nicht.)
s~^s(.+(?<!\)/)(.+)(?<!\)/g$~preg_replace('$1','$2',$scnr);~;
uebrigens kann man den urspruenglichen ausdruck auch noch kuerzen:
s/[(/?[uib])]/<$1>/g
oder sogar
s~[(/?[uib])]~<$1>~g
prost
seth
Moin!
s/[(/?[uib])]/<$1>/g
oder sogar
s~[(/?[uib])]~<$1>~g
Ich weiß. Aber erzäl mal einem Nicht-Perlator daß man auch andere Zeichen anstelle von / bei regulären Ausdrücken verwenden kann. [uib] statt (u|i|b) habe ich verwendet, weil Du spätestens bei FONT und SIZE ohnehin dort landest. / und tag in eine Klammer habe ich nicht verwendet, zum Einen wegen der Übersichtlichkeit, zum Anderen spart es nichts, spätestens, wenn man bei Alternativen statt Zeicehnklassen ist:
(/?)(u]i|b|FONT\b[^>]+)
(/?(?:u|i|b|FONT\b[^>]+))
Meins ist 2 kürzer, dafür ist der Erstzausdruck $1$2 um 2 länger als Dein $1.
Letzten Endes bleibt es bei TIMTOWTDI und der Frage: Bist Du schon Perl Mönch ;-)
-- Skeeve
gudn tach!
s~[(/?[uib])]~<$1>~g
Ich weiß. Aber erzäl mal einem Nicht-Perlator daß man auch andere Zeichen anstelle von / bei regulären Ausdrücken verwenden kann.
habe ich, naemlich dem archiv. ;-p
[uib] statt (u|i|b) habe ich verwendet, weil Du spätestens bei FONT und SIZE ohnehin dort landest.
ok, so gesehen macht das sinn.
Letzten Endes bleibt es bei TIMTOWTDI
sowieso und vor allem bei perl.
und der Frage: Bist Du schon Perl Mönch ;-)
noe, bin ich nicht.
prost
seth
gudn tach!
und der Frage: Bist Du schon Perl Mönch ;-)
noe, bin ich nicht.
Dann mach hinne ;-)
mir fehlt leider die zeit, mich intensiver mit perl zu beschaeftigen. insofern sehe ich das beitreten in eine community, in der ich eh kaum was machen wuerde, als vorlaeufig ueberfluessig an.
prost
seth
hier mal mein entwurf so aus m kopf raus, etwas kürzer:
$text = preg_replace("/[i](.*)[/i]/s", "<em>'$1'</em>",$text);
bin auch kein profi, aber wenn nciht grade n typo drinne ist, funktioniert das auch. /s damits auch über mehrere zeilen hinweg funktioniert. klammern um .* weil wir das ja extra brauchen ($1)
/([i]) <-- da brauchste keine klammern drum, willst das [i] ja später nicht ansprechen, nur was dazwischen steht
([^([|])]*) <-- hmm da sehe ich atm keinen sinn drinne, was willst du damit bezwecken?
([/i])/ <-- analog zu ([i])
n'abend,
Ich möchte in meinem selbstgeschriebenen CMS meiner Page die Möglichkeit haben, eigene Tags zu setzen, die in eckige Klammern gesetzt werden à la [i] und [/i].
man braucht das Rad nicht jedes Mal neu erfinden. Schon gar nicht, wenn es bereits brauchbare Lösungen gibt und man es selbst (vorerst) kaum besser machen kann (*).
Christian Seiler schrieb vor einiger Zeit eine (etwas durchdachtere) BBCode-Klasse. Schau sie dir an und überlege dir, ob du deine Zeit nicht sinnvoller einsetzen kannst.
(*) Weder ein Angriff, noch abwertend gemeint.
weiterhin schönen abend...