kills Geschrieben 18. Oktober 2004 Geschrieben 18. Oktober 2004 Hallo zusammen, ich bräuchte ein wenig hilfe bei einer Regex. Und zwar Suche ich einen Ausdruck (zur späteren Verwendung mit PHP) um dreifache "<br>"`s herauszufiltern. Heisst also, das ich maximal eine Leerzeile zwischen zwei elementen zulassen möchte. Ich hab selbst so gut wie keine Erfahrung mit RegEx und wüsste auf die schnelle auch nciht wie ich das anstellen soll! Danke im vorraus!
gurkenpapst Geschrieben 18. Oktober 2004 Geschrieben 18. Oktober 2004 <?php $string = "bjf fh gkfjghkf hkfdh sgkfd <br><br><br>fhkjdshfkjdshfk hkj shfksfh kj "; echo "Einfach:<br>"; echo str_replace("<br><br><br>","<br><br>",$string); echo "Regexp:<br>"; echo ereg_replace("(<br>){3}","<br><br>",$string); ?>
etreu Geschrieben 19. Oktober 2004 Geschrieben 19. Oktober 2004 $br = "[<br>]"; echo preg_replace("|($br{2})$br+|","\$1",$string); [/PHP]
kills Geschrieben 19. Oktober 2004 Autor Geschrieben 19. Oktober 2004 $br = "[<br>]"; echo preg_replace("|($br{2})$br+|","\$1",$string); [/PHP] danke schonma, nun bräuchte ich noch, dass er auch <br /> mit einbezieht, da ja <br> und <br /> das gleiche bewirken. Er soll auch alle "leading" -<br>`s abschneiden. Also heisst falls ganz am anfang welche sind, alle wegschneiden.
DevilDawn Geschrieben 19. Oktober 2004 Geschrieben 19. Oktober 2004 nun bräuchte ich noch, dass er auch <br /> mit einbezieht, da ja <br> und <br /> das gleiche bewirken. Er soll auch alle "leading" -<br>`s abschneiden. Für 1: $pattern = "|(<br[ /]*>){3}|"; $replace = "<br><br>"; Für 2: $pattern = "|^(<br[ /]*>)*(.*)$|"; $replace = "\$2"; Genauer gesagt matchen die Pattern auf alle Tags die mit <br anfangen, mit > aufhören und dazwischen beliebige Mengen Spaces und Slashes haben.
kills Geschrieben 20. Oktober 2004 Autor Geschrieben 20. Oktober 2004 Für 1: $pattern = "|(<br[ /]*>){3}|"; $replace = "<br><br>"; Für 2: $pattern = "|^(<br[ /]*>)*(.*)$|"; $replace = "\$2"; Genauer gesagt matchen die Pattern auf alle Tags die mit <br anfangen, mit > aufhören und dazwischen beliebige Mengen Spaces und Slashes haben. besten dank euch allen! Ich werds heute abend gleich ma ausprobieren! :uli
kills Geschrieben 21. Oktober 2004 Autor Geschrieben 21. Oktober 2004 hm also sieht ganz gut aus, nun müssten aber noch alle Bilder "<img>" raus
etreu Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 komplett raus also? $img = "[<img.+?/?>]"; echo preg_replace("|$img|","",$string); [/PHP]
kills Geschrieben 22. Oktober 2004 Autor Geschrieben 22. Oktober 2004 danke ich werds versuchen. Warum sind die Patterns eigentlich von "|" eingeschlossen? sowas hab ich noch nie gesehen. Was bewirkt dieses Vorgehen? Ich kenn das nur mit "/PATTERN/"
etreu Geschrieben 22. Oktober 2004 Geschrieben 22. Oktober 2004 Du must als Begrenzer ein Zeichen nehmen, dass nicht Teil des Musters ist. Sonnst kommt es zum Fehler beim Komplilieren des RegEx. Man hätte auch °, §, [], usw. nehmen können.
kills Geschrieben 2. November 2004 Autor Geschrieben 2. November 2004 also, die RegEx müsse ein wenig umgebogen werden, aber ich weiss schon wieder nicht wie :floet: also ich möchte alle html tags ausser das img-Tag aus einem Text entfernen, und im Image tag sollen folgende eingeschaften gesetzt sein 'align="left" hspace="10"' ist das machbar? Danke im vorraus!
etreu Geschrieben 2. November 2004 Geschrieben 2. November 2004 Erst mal mit striptags, alle Tags entfernen. Mit dem optionalen Parameter kannst du die Tags angeben, die drin bleiben. $pattern = '|[^<img.+?align="left" hspace="10".+?/?>]|ms';
kills Geschrieben 3. November 2004 Autor Geschrieben 3. November 2004 Erst mal mit striptags, alle Tags entfernen. Mit dem optionalen Parameter kannst du die Tags angeben, die drin bleiben. $pattern = '|[^<img.+?align="left" hspace="10".+?/?>]|ms'; Danke schatzi, heut abend werd ichs ausprobieren ;-)
kills Geschrieben 4. November 2004 Autor Geschrieben 4. November 2004 ich habs jetzt so: $string = '<div style="text-align: center;"><img src="abc.gif" border="0" hspace="0" vspace="0"><br><br><div style="text-align: left;">Text test dasdfjkalsdf</div></div>'; $pattern = '|<img.*/?>|'; $replace = '|[^<img.+?align="left" hspace="10".+?/?>]|ms'; echo preg_replace( $pattern, $replace, $string); /* Ausgabe: |[^<img. +?align="left" hspace="10" .="">]|msText test dasdfjkalsdf */ [/PHP] wo is mein fehler?
etreu Geschrieben 5. November 2004 Geschrieben 5. November 2004 Beim replace dürfen kein RegEx drin stehen. Ausserdem könnte es aktuell passieren, dass die Attribute align und hspace im Ergebnis doppelt vorkommen. Soll denn bei allen Img-Tags diese Attribute gesetzt/ersetzt werden?
kills Geschrieben 5. November 2004 Autor Geschrieben 5. November 2004 Beim replace dürfen kein RegEx drin stehen. Ausserdem könnte es aktuell passieren, dass die Attribute align und hspace im Ergebnis doppelt vorkommen. Soll denn bei allen Img-Tags diese Attribute gesetzt/ersetzt werden? Hi Enrico, - doppelte sollen nicht entstehen ( heisst werte überschreiben wenn vorhanden) - hm das ganze kann bei allen images passieren, ist kein ding Danke soweit.
kills Geschrieben 5. November 2004 Autor Geschrieben 5. November 2004 muss ich das mit preg_replace_callback() anstellen ?? Gruß, Markus
etreu Geschrieben 6. November 2004 Geschrieben 6. November 2004 Ich glaube das wäre fast sinnvoll. Dann könnte man alle Bilder nehmen und dann in der Funktion/ Methode entsprechend verzweigen (nochmal auf Existenz der Attribute prüfen).
kills Geschrieben 7. November 2004 Autor Geschrieben 7. November 2004 Ich glaube das wäre fast sinnvoll. Dann könnte man alle Bilder nehmen und dann in der Funktion/ Methode entsprechend verzweigen (nochmal auf Existenz der Attribute prüfen). danke nochma, ich habs mit der function preg_replace_callback hinbekommen. :hodata
kills Geschrieben 19. Februar 2005 Autor Geschrieben 19. Februar 2005 halli hallo zusammen, ich hab neue reg ex probleme ich möchte abkürzungen im text durch einen "outputfilter" jagen und so dann mit speziellen klassen erweitern damit ich diese entsprechend per css bestimmt formatieren kann. $subject = 'hier steht ein text, z.b. "dieser" <img src="ab.gif" alt="z.b. text"/>'; $pattern = '@z.b@i'; $replace = '<span class="shortcut">z.B.</span>'; $txt = preg_replace( $pattern, $replace, $subject); [/PHP] Nun ersetzt meine vorgehensweise leider auch auch das "z.b" im alt-Tag. Dies darf nicht passieren. Es darf also nur in texten ersetzt werden die nicht zu einem tag gehören. Danke und Gruß, Markus
etreu Geschrieben 20. Februar 2005 Geschrieben 20. Februar 2005 Dann mache ich es auch mal kurz: $pattern = "@(<.+?>)($short)(</.+?)*@i"; $replace = "\$1<span class=\"shortcut\">\$2</span>\$3"; $text = preg_replace($pattern, $replace, $text); [/PHP] Vielleicht auch interessant: http://de2.php.net/manual/de/function.preg-replace-callback.php
kills Geschrieben 21. Februar 2005 Autor Geschrieben 21. Februar 2005 Dann mache ich es auch mal kurz: $pattern = "@(<.+?>)($short)(</.+?)*@i"; $replace = "\$1<span class=\"shortcut\">\$2</span>\$3"; $text = preg_replace($pattern, $replace, $text); [/PHP] Vielleicht auch interessant: http://de2.php.net/manual/de/function.preg-replace-callback.php hm danke schonmal enrico. Aber leider ist genau das gegengesetzte eingetreten was passieren soll,... er ersetzt jetzt genau nur die shortcuts die in "" stehen. die im fortlaufenden text lässt er unangetastet. ich habe das ganze so eingebaut: [PHP] function glossar_replace( $string) { global $REX; $mypage = "glossar"; // only for this file $I18N_GLOSSAR = new i18n($REX[LANG],$REX[INCLUDE_PATH]."/addons/$mypage/lang/"); // CREATE LANG OBJ FOR THIS ADDON $sql = new sql; $sql->setQuery("select * from rex__glossar order by shortcut"); for($i=0;$i<$sql->getRows();$i++) { $language = $sql->getValue("language"); if ( $language == 0) { $language = $I18N_GLOSSAR->msg('lang_de_short'); } elseif ( $language == 1) { $language = $I18N_GLOSSAR->msg('lang_en_short'); } else { $language = $I18N_GLOSSAR->msg('lang_fr_short'); } $id = $sql->getValue("short_id"); $shortcut = htmlentities($sql->getValue("shortcut")); $description = htmlentities($sql->getValue("description")); $language = trim( $language); $casesense = $sql->getValue("casesense"); $search = '@(<.+?>)('. $shortcut .')(</.+?)*@'; $replace = '$1<span lang="'. $language .'" xml:lang="'. $language .'" title="'. $language .': '. $description .'" class="shortcut">$2</span>$3'; $subject = $string; if ( $casesense == 0) { $search .= 'i'; } $string = preg_replace( $search, $replace, $subject); $sql->counter++; } return $string; } siehe: http://www.sokba.de/relaunch/index.php?article_id=57 Das Wort "Dr. Sommer" wird z.b. ersetzt
etreu Geschrieben 21. Februar 2005 Geschrieben 21. Februar 2005 Probier mal: $pattern = "@(<.+?>)($short)(</.+?>)*@i"; Ich hatte vergessen, vom schliessenden Tag, die Klammer wieder zu schliessen.
etreu Geschrieben 22. Februar 2005 Geschrieben 22. Februar 2005 probier mal lieber: $search = '@(<.+?>)(.+?)(z.B.)(.+?)(</.+?>)*@'; $replace = '$1$2<span class="shortcut">$3</span>$4$5'; [/PHP]
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden