Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » PHP » Problem mit Regulären Ausdrücken

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.04.2007, 14:34 Uhr
Yadgar



High!

Ich habe folgendes vor: aus lokal gespeicherten HTML-Seiten mit Nachrichten-Texten diverser internationaler Agenturen (über Afghanistan, was sonst?) soll jeweils der reine Nachrichtentext extrahiert werden. Da ich festgestellt zu haben glaube, dass diese Texte üblicherweise nach dem ersten <p>-Tag beginnen, entferne ich erst mal mit strchr alles, was vor diesem Tag steht.

Danach muss alles ab dem ersten Tag, der weder <p> noch </p> ist, abgeschnitten werden (den Algorithmus müsste man natürlich noch verfeinern, es kann ja sein, dass mitten im Text noch irgendwelche anderen Tags vorkommen). Dazu verwende ich dann eregi_replace() mit einem Regulären Ausdruck:


PHP 4:
$reg ="((<)|(</))[^p]{1}.*";
eregi_replace($reg, "", $puffer);



Eigentlich sollte diese Anweisung bewirken, dass ab dem ersten öffnenden oder schließenden Tag, das nicht p (bzw. P) enthält (genauer, jedes andere Zeichen außer p (bzw. P) und null bis beliebig viele weitere Zeichen, alles durch einen Leerstring ersetzt wird.

Tut sie aber nicht, statt dessen löscht sie alles ab dem ersten </p>-Tag... was ja auch kein Wunder ist, da die Bedingung nicht eindeutig ist: der Parser kann nicht zwischen < am Anfang und nachfolgendem / als nichtzugelassenem Zeichen und </ am Anfang unterscheiden.

Aber wenn ich die Bedingung so formuliere, dass dieser Umstand berücksichtigt wird:

$reg ="(<([^p]&[^/]).*";

werden Nicht-<p>...</p>-Tags überhaupt nicht gefunden!

Was mache ich falsch?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.04.2007, 14:36 Uhr
Yadgar



Oops, es muss natürlich

$reg ="(<)([^p]&[^/]).*";

heißen!
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 20.04.2007 um 14:37 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.04.2007, 14:41 Uhr
FunnyDingo



Wie wäre es denn wenn du mit preg_match arbeitest? Das müsste dann in etwa so aussehen (ungetestet):

PHP 4:
if (preg_match("/<p>(.*)<\/p>/i", $text, $matches)
    // In $matches[1] steht nun alles zwischen den beiden Tags
else
    // $text trifft nicht auf den Ausdruck zu

--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de

Dieser Post wurde am 20.04.2007 um 14:42 Uhr von FunnyDingo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
20.04.2007, 15:03 Uhr
Yadgar



High!


Zitat von FunnyDingo:
Wie wäre es denn wenn du mit preg_match arbeitest? Das müsste dann in etwa so aussehen (ungetestet):

PHP 4:
if (preg_match("/<p>(.*)<\/p>/i", $text, $matches)
    // In $matches[1] steht nun alles zwischen den beiden Tags
else
    // $text trifft nicht auf den Ausdruck zu



Das ist ja noch kryptischer... da blicke ich überhaupt nicht mehr durch! Geht es nicht einfacher?

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
20.04.2007, 15:05 Uhr
Yadgar



High!


Zitat von FunnyDingo:
Wie wäre es denn wenn du mit preg_match arbeitest? Das müsste dann in etwa so aussehen (ungetestet):

PHP 4:
if (preg_match("/<p>(.*)<\/p>/i", $text, $matches)
    // In $matches[1] steht nun alles zwischen den beiden Tags
else
    // $text trifft nicht auf den Ausdruck zu



Weil mir preg_match nicht passend erschien, habe ich es stattdessen mal mit preg_replace und deinem regulären Ausdruck versucht - nach wie vor werden die Nicht-p-Tags nicht erkannt!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
20.04.2007, 15:35 Uhr
FunnyDingo



Gib doch mal einen Beispiel-Code für deine Quelle
--
"Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral." (John James Osborne)

Meine Website: http://www.funnydingo.de
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.04.2007, 09:34 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Etwa so:

PHP 4:
<?

$text = "123Test<foo>bar</foo><p>Test12345foobarblubb</p>bazquuo";
$newtext = preg_replace("/.*?<[^p]+>/", "", $text);
echo $newtext . "\n";

?>

?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
05.05.2007, 21:35 Uhr
Riku




PHP 4:
<?
$text = "123Test<foo>bar</foo><p>Test12345foobarblubb</p>bazquuo";
$newtext = preg_replace("/<[^p]+>(.*?)<\/[^p]+>/", "<nachricht>$1<nachricht>", $text);
$nachrichten=explode("<nachricht>",$newtext);
$newtext=$nachrichten[1];
echo $newtext . "\n";
?>



Das ganze hab ich nicht getestet

Dieser Post wurde am 05.05.2007 um 21:45 Uhr von Riku editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ PHP ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: