robuster regex - bauanleitung

ossama_bin_ladin

Grünschnabel
moinsen hier.

heute bauen wir uns einen regex - eine robusten und verdammt stabilen Regex - wie machen wird das?

Zuallererst nochmals guten tag alle hier. also ich bin neu hier und wollte erstaml hallo sagen. Ich muss einen harten job machen unter phpBB und ich muss mich in die reg Expressions von Perl einarbeiten. Die Regex sind dafür gedacht, Teile aus der page-source zu filtern.

gut, wo ist die SETITE auf die wir einen REGEX brauchen - hier;zb.

http://www.phpbb.com/phpBB/viewtopic.php?p=23333 - ist nur ein beispiel
jetzt einfach den quelltext anzeigen - un dann muss ich den REGEX bilden.

also fangen wir an die Teile:

[diese Teile habe ich aus http://www.phpbbdoctor.com/doc_tables.php ]

phpbb_categories
phpbb_forums Forums for your board.
phpbb_groups A group of users
phpbb_posts Posts for your board. Each post is part of a Topic.
phpbb_posts_text The text for the post
phpbb_topics Topics for your board. A Forum contains Topics. A Topic contains Posts.
phpbb_users Base user information, preference settings, and so on.
phpbb_user_group Cross-reference table between users and groups they belong to. Note that in the phpBB 2.x product every user is a member of at least one group.

Ziel ist, einen allgemeinen und einen sehr sehr robusten Regex zu haben - dieser Threads
http://www.phpbb.com/phpBB/viewtopic.php?p=23333 - Das ist nur ein beispiel.
Also jetzt einfach den quelltext anzeigen - un dann muss ich den REGEX bilden.

Der Regex soll wenn er sicher steht und robust ist, für die Auswertung, das parsen von threads herangezogen werden koennen. Das Ziel hinter der technischen Ansterngung ist dass ich Forendaten, nicht über den Brwowser lesen kann sondern automatisch mit perl hole.

-via LWP
-und dann eben mit einem parser /oder einer regex durchsuce nach bestimmten datne.

hmm hat wer eine idee wie ich den regex bilde!`!

gruss
ossi


Also, Weil das ja auch eine Frage der Skins sein kann, die auf dem phpBB laufen, wie der Regex aussehen tut: Der regex kann sich an einem Standart-theme halten .- einem phpbbstandard-theme. Wenn wir ihn daraufhin entwicklen dann wär das genau passend. Hier ein paar Standardthemes.


http://www.phpbb.com/phpBB/
http://www.phpbb.de/index.php
http://www.nukeforums.com/forums/index.php
 
Zuletzt bearbeitet:
HYA LEUTZ

greetz von ossi.- ich glaube dass wir auf die span classes.... achten müssen. Wir müsssen alle ('span', {'class' : 'postdetails'}), herausfinden aus der CSS
Und darin stehen die Infos -. wie z.B. die User-Infos.

Also wenn es etwas wäre wie <i><br />Bernhard<br /></i> dann machen wir einen Regex der so aussehen kann.



Code: /<i><br \/>(*.)<\/i><br \/>/i



Ein Code: /<i><br \/>(.*)<\/i><br \/>/i








Code:
/<td .*><span .*><a .*></a><b>(.*)</b></span><br /><span .*>Mitglied<br /><br /><br />Anmeldedatum: (.*)<br />Beiträge: (.*)<br />
.</span><br /></td>
.<td .*><table .*>
.<tr>
.<td .*><a href=".*"><img src=".*" .* title="Beitrag" .* /></a><span .*>Verfasst am: (.*)<span .*>&nbsp;</span>&nbsp; &nbsp;Titel: (.*)</span></td>
.<td .*><a href=".*"><img .* /></a>.</td>
.</tr>
.<tr>
.<td colspan="2"><hr /></td>
.</tr>
.<tr>
.<td colspan="2"><span .*>.*</span>
.</td>
.</tr>
.</table></td>
.</tr>/sU


wie kann ich das testen. Bitte gebt tipps. thx
alla denn - bis bald - und

LEUTZ - bis bald euer Ossi
 
Erstmal Willkommen im Forum.

/*off-topic*/
Dann zu Begin gleich mal die Bitte, dass du dich an die Boardregeln insbesondere Punkt 15 hältst (Groß-/Kleinschreibung).
Entferne bitte auch die "Doppelpost in einem". Du hast nämlich genau zweimal das gleiche geschrieben.

/*back*/
So wie ich das verstanden habe, willst du das ganze ja in Perl machen.
Das Ziel hinter der technischen Ansterngung ist dass ich Forendaten, nicht über den Brwowser lesen kann sondern automatisch mit perl hole.

Ich glaube zwar, dass RegExp in beiden Sprachen etwa gleich ist, aber dennoch wird der Thread dann dort besser aufgehoben sein. Lasse ihn daher bitte verschieben. (NICHT neu aufmachen).
 
Zuletzt bearbeitet:
hallo Fanste,

fanste hat gesagt.:
Erstmal Willkommen im Forum.

/*off-topic*/
Dann zu Begin gleich mal die Bitte, dass du dich an die Boardregeln insbesondere Punkt 15 hältst (Groß-/Kleinschreibung).
Entferne bitte auch die "Doppelpost in einem". Du hast nämlich genau zweimal das gleiche geschrieben.

/*back*/
So wie ich das verstanden habe, willst du das ganze ja in Perl machen.


Ich glaube zwar, dass RegExp in beiden Sprachen etwa gleich ist, aber dennoch wird der Thread dann dort besser aufgehoben sein. Lasse ihn daher bitte verschieben. (NICHT neu aufmachen).

alles klar - /(ich werde auch die Gross und Kleinschreibung versuchen zu beachten . -.iss aber etwas viel wenn man aufs Technische wertlegt ) Fangen wir an.

Deine Ideen, nebenbei bemerkt sind nicht schlecht - ich bin aber hier mitten im Workout von dem Code. Und nun sind mir noch Fragen gekommen.

Was machen wir aber wenn das board die Verwendung von HTML erlaubt: Dann schreibt jemand so etwas in seinen Post

PHP:
....</span> 
</td> 
</tr> 
</table></td> 
</tr>

Es macht mir noch etwas Bauchschmerzen wie ich das lösen soll mit dem DB eintrag;
Apropos; für die Umsetzung in PHP :: also ich habe mir das mal angesehen hier


http://www.phpbar.de/w/Regul%C3%A4re_Ausdr%C3%BCcke


preg_match Zum Durchsuchen einer Zeichenkette
preg_match_all Zum Durchsuchen einer Zeichenkette
preg_replace Zum Durchsuchen und Ersetzen in Zeichenketten und Arrays
preg_replace_callback Spezielle Form von preg_replace()
preg_split Funktioniert wie explode(), mit dem Unterschied das man auch RegEx benutzen kann.
preg_quote Funktioniert wie addslashes(), bloß für RegEx-Zeichen
preg_grep Durchsucht ein Array und gibt die Suchergebnisse als Array zurück

für meine Aufgabe ists vielleicht das beste wenn ich keine ereg verwende.

ereg ist eine regular expression function, basierend auf dem POSIX regular expression standard. Preg (Based on PCRE) scheint aber passender zu sein: Es ist leistungsfähiger und oft schneller. Ausserdem wird POSIX zum PCECL - in absehbarer Zeit.
Also sollte ich preg_match/replace ider substr verwenden, um meine Daten rauszusuchen.

Und ich sollte vielleicht PCRE modifiers verwenden Wir könnten den Inhalt des Files behandeln wie wenn er in einer Zeile daher käme. und das würde dann den Stress mit dem Zeielenumbruch verhindern.

Ich bin halt jetz an dem Punkt dass ich die geparsten Daten in ein phpBB-Datenbank einfügen sollte. Und hierfür brauche ich tipps und einen Ansatz.

vielen Dank für erste Infos.

greetz
 
Hast du meinen Post überhaupt richtig gelesen? Ich habe dich gebeten das Doppelte in deinem Post rauszulöschen.
 
Moinsen Fanste,

danke fuers posten ;-) ich kümmer mich gleich um den übriggebliebenen Post. Soll ich das mal eben löschen!? Ich werde das gleich versuchen; Manche Boards lassen das ja nicht so einfach zu.... Werds testen.
Update 20:20Uhr: habe es getestet - da lässt sich imho nur einzelnes im Text ändern aber so wies aussieht nicht löschen - Board ist resistent:Habe hier wohl keine Rechte das zu tun....;


fanste hat gesagt.:
Da gibt es noch einen: http://www.tutorials.de/forum/1319230-post2.html ;)

Zu deinem Problem mit dem, dass jemand HTML Code postet:
Da dürftest du keine Probleme bekommen, da eigentlich alle HTML-(Tag-)Zeichen (z.B. ", <, >) umgewandelt werden. so wird dann aus " z.B. &quot;.

Danke fuer die Hilfe und fürs Unbedenklich-erklären. Ich habe den oben geposteten Parser noch nicht getestet. Das mach ich noch. BTW: es gibt zahlreiche Onine-Quellen wo ich das machen kann. Könnt ihr da was besonderes empfehlen?
Hmm - also ich frage mich momentan noch ob das so wies oben geposte ist auch das alles mached was es soll. Was meint ihr? Die nächste Aufgabe ist sehr sehr eingemacht; Da gehts dann richtig ans eingemachte. BTW- stimmt das jetzt oder sitze ich hier einem Irrtum auf: Deshalb glaube ich immer mehr dass ich das mit preg_match machen sollte.


preg_match - http://www.php.net/preg_match int preg_match ( string pattern, string subject [, array &matches [, int flags [, int offset]]] ) Searches subject for a match to the regular expression given in pattern. If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on... das ist aus der Doku;

Also: ich kriege wenn ich das mit preg_match mache, dann ein schönes ARRAY raus. dann kann ich das fuer einen DB-Insert herstellen. Hmm ich werde da mal gucken wie ich das herstellen kann.


Habt ihr Ideen, wie ich das der DB übergeben kann?!

Euer Ossama_bin_ladin

FRAGE noch; Was würde mir denn hier dieser RDF-PARSER bringen.. inwiewit macht RDF denn auch das was ich mache!? bzw machen will? http://www.phpbb.de/rdf/rdf_parser.phps
 
Zuletzt bearbeitet:
@Ossi: Erstmal, willkommen im Forum.
Ich war grad mal so frei Deinen doppelten Text aus Deinem Post zu entfernen, das ist ja nur unnoetig verwirrend wenn man da 2 mal das Selbe gleich nacheinander liest.
 
moinsen Dennis,

danke fuers posten - danke fuer die Aktivität! Habs net loeschen koennen.

Dennis Wronka hat gesagt.:
@Ossi: Erstmal, willkommen im Forum.
Ich war grad mal so frei Deinen doppelten Text aus Deinem Post zu entfernen, das ist ja nur unnoetig verwirrend wenn man da 2 mal das Selbe gleich nacheinander liest.

also hier bin ich nochmal: hier nochmals Ossama_bin_Ladin mit einer weiteren Diskussion des REGEX - und seiner Ausführung. Also, kann ich den oben beschriebenen Regex denn in die preg_macht_all ( mit oder ohne all) einbauen? Geht das denn!? Also, ich habe das bei einem stoebern gefunden.

http://php-wiki.de/index.php/Function.preg-match-all

preg_match_all

(PHP 3>= 3.0.9, PHP 4 , PHP 5) preg_match_all -- Führt eine umfassende Suche nach Übereinstimmungen mit regulärem Ausdruck durch

eine Beschreibung: int preg_match_all ( string Suchmuster, string Zeichenkette, array Treffer [, int Flags [, int Versatz]])
</BR >

Durchsucht Zeichenkette nach allen Übereinstimmungen mit dem in Suchmuster angegebenen regulären Ausdruck und legt sie in der durch Flags festgelegten Reihenfolge in Treffer ab. Nachdem die erste Übereinstimmung gefunden wurde, wird die nachfolgende Suche jeweils am Ende der letzten Übereinstimmung fortgesetzt.
Flags kann eine Kombination folgender Flags sein (beachten Sie, dass es keinen Sinn hat, PREG_PATTERN_ORDER zusammen mit PREG_SET_ORDER zu verwenden): <P >

http://php-wiki.de/index.php/Function.preg-match-all

Beispiel 2. Zusammen gehörende HTML-Tags finden (gierig)

Code:
<?php
// Das \\2 ist ein Beispiel für Rückreferenzierung. Es teilt pcre mit, dass
// der reguläre Ausdruck mit dem für das zweite Klammerpaar, also in diesem
// Fall mit dem für ([\w]+) gefundenen Ausdruck selbst übereinstimmen muss.
// Der zusätzliche Backslash wird wegen der doppelten Anführungsstriche
// benötigt.
$html = "<b>fett gedruckter Text</b><a href=howdy.html>klick mich an</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*)(<\/\\2>)/", $html, $treffer);

for ($i=0; $i< count($treffer[0]); $i++) {
  echo "gefunden: " . $treffer[0][$i] . "\n";
  echo "Teil 1: " . $treffer[1][$i] . "\n";
  echo "Teil 2: " . $treffer[3][$i] . "\n";
  echo "Teil 3: " . $treffer[4][$i] . "\n\n";
}
?>

Dieses Beispiel erzeugt dann:

gefunden: <b>fett gedruckter Text</b> Teil 1: <b> Teil 2: fett gedruckter Text Teil 3: </b> gefunden: <a href=howdy.html>klick mich an</a> Teil 1: <a href=howdy.html> Teil 2: klick mich an Teil 3: </a>

also es geht darum ob ich das so machen kann, wie hier beschrieben http://php-wiki.de/index.php/Function.preg-match-all - mit preg_match eben, oder mit preg_match all!?

bitte um Ideen und Tipps.
danke
euer Ossama_bin_ladin
Ossi aus leidenschaft ,-)
 
Zurück