php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.03.2011, 17:46  
Benutzer
 
Registriert seit: 19.05.2009
Beiträge: 38
hjw-kunstwerk befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank @ChrisB für die Antwort, leider bin ich mit den Regex nicht so vertraut um genau zu verstehen wie ich das machen könnte was Du meinst.

Wäre es möglich mir ein Beispiel anhand meines Patterns zu geben wo und wie ich das einsetzen müsste bzw. gruppieren müsste oder hab ich das jetzt ganz falsch verstanden?

Ich wäre sehr dankbar wenn mir geholfen werden könnte.
hjw-kunstwerk ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.03.2011, 12:03  
Benutzer
 
Registriert seit: 19.05.2009
Beiträge: 38
hjw-kunstwerk befindet sich auf einem aufstrebenden Ast
Standard Mit preg_replace a href-Tags gegen URL ersetzen

Die RegExp soll in jeweils in einem String MEHRERE a href-Tags mit preg_replace gegen die URL ersetzen. Zur Zeit wird nur das erste a href-Tag ersetzt. Warum??

Beispiel:
PHP-Code:
$text '<p>Hier steht text und hier steht ein <a href="http://web.de" title="bla">Link</a> und hier steht wieder text und noch ein <a href="http://web.de" title="bla">Link</a> <br> und noch ein <a href="http://web.de" title="bla">Link</a>, <a href="http://web.de" title="bla">Link</a>.</p>';

preg_replace('/<a\s[^>]*href=(\"??)?((http|https|ftp)?(:\/\/)?(www)?(([a-zA-Z0-9-_]+\.|\.)+([a-zA-Z0-9-_]+.)+([a-zA-Z]{2,4})?((\?)?([A-Za-z0-9-_]?=[A-Za-z0-9-_]?(&[A-Za-z0-9-_]?=[A-Za-z0-9-_]?)*)?([^\S]+[$\"])?)))([^\" >]*)\\1[^>]*>(.*)<\/a>*/is''$2'$text);

print 
$text
Problem:
Mit diesen Pattern wird zwar das a href-Tag erkannt und mittels der preg_replace gegen die URL ersetzt, doch leider wird immer nur der aller erste a href-Tag ersetzt und danach wird der String abgeschnitten.

Meine Frage:
Wie müsste ich den Pattern gruppieren, sodass ich das a href-Tag mehrmals mit preg_replace ersetzt wird?

Hinweis: Script einfach kopieren und testen.


Ich wäre sehr dankbar, wenn ihr mir evtl. einen Tipp gegeben könntet, woran dies liegen könnte. Ich bin leider alleine nicht weiter gekommen und auch mit der Forensuche und Google wurde ich nicht fündig.

Herzlich Grüße! Und danke im Vorraus!

Geändert von hjw-kunstwerk (08.03.2011 um 12:05 Uhr). Grund: Wort vergessen, Sorry!
hjw-kunstwerk ist offline   Mit Zitat antworten
Alt 08.03.2011, 12:43  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.730
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Ich persönlich finde das Pattern zu krass, um mich damit befassen zu wollen.

Wo nimmst du die immer her?

Wenn du komplexere Dinge tun musst, versuche vielleicht, nicht alle Logik in das Pattern zu quetschen, sondern erstmal grob zu matchen und dann die feineren Schritte durch normalen PHP-Code zu erledigen. Vielleicht per preg_replace_callback.

Code:
(.*)<\/a>
Das hier scheint mir greedy zu sein.
__________________
Blog | Buch | Kaloa
mermshaus ist gerade online   Mit Zitat antworten
Alt 08.03.2011, 13:33  
Benutzer
 
Registriert seit: 19.05.2009
Beiträge: 38
hjw-kunstwerk befindet sich auf einem aufstrebenden Ast
Standard

Danke @mermshaus für die schnelle Antwort. Ok ist verständlich, doch mir scheint es die beste Möglichkeit zu sein alle Strings mit preg_replace zu ersetzen.

Zitat:
Wo nimmst du die immer her?
Zum Teil selbst geschrieben und zum anderen Teil aus Beispielen von http://regexlib.com/Search.aspx?k=src&c=-1&m=-1&ps=20.

Mit einer preg_replace_callback habe ich schon erste Erfahrungen gemacht, doch leider wüsste ich jetzt nicht wie ich dies bei diesem Pattern einsetzen könnte bzw. wie ich es umschreiben müsste?

Es war eigentlich meine Absicht das ganze Pattern gierig zu haben, da ich ja will das es mehrmals die a href-Tags ersetzt.

@all
Ich wäre sehr dankbar falls sich jemand erbarmen würde einen Blick über dieses Pattern zu werfen, wo ich den Fehler habe das es sich nich wiederholt??

Beste Grüße!
hjw-kunstwerk ist offline   Mit Zitat antworten
Alt 08.03.2011, 15:35  
Erfahrener Benutzer
 
Benutzerbild von mermshaus
 
Registriert seit: 14.06.2009
Beiträge: 1.730
PHP-Kenntnisse:
Fortgeschritten
mermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz seinmermshaus kann auf vieles stolz sein
Standard

Kleine Demonstration von greedy und ungreedy:

PHP-Code:
<?php

$demo 
= <<<EOT
A abcde Z   xxxxxxxx    A abde Z   xxxxxxx    A abcdef Z
EOT;

// Alles zwischen A und Z (inklusive) löschen

echo '"' preg_replace('/A(.*)Z/'''$demo) . '" (greedy)<br>';
echo 
'"' preg_replace('/A(.*?)Z/'''$demo) . '" (ungreedy)<br>';
Im greedy-Fall matcht preg_replace einmal für den Abschnitt vom ersten A bis zum *letzten* Z.

Zu deinem Pattern: Vielleicht so:

PHP-Code:
<?php

$text 
'<p>Hier steht text und hier steht ein <a href="http://web.de" title="bla">Link</a> und hier steht wieder text und noch ein <a href="http://web.de" title="bla">Link</a> <br> und noch ein <a href="http://web.de" title="bla">Link</a>, <a href="http://web.de" title="bla">Link</a>.</p>';

$text preg_replace(
        
'~<a\s[^>]*href="((?:https?://|ftp://|www\.)[^"]+)"[^>]*>(.*?)</a>~is',
        
'$1'$text);

print 
$text;
__________________
Blog | Buch | Kaloa

Geändert von mermshaus (08.03.2011 um 15:39 Uhr).
mermshaus ist gerade online   Mit Zitat antworten
Alt 08.03.2011, 15:58  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Zitat:
Zum Teil selbst geschrieben und zum anderen Teil aus Beispielen von http://regexlib.com/Search.aspx?k=src&c=-1&m=-1&ps=20.

Mit einer preg_replace_callback habe ich schon erste Erfahrungen gemacht, doch leider wüsste ich jetzt nicht wie ich dies bei diesem Pattern einsetzen könnte bzw. wie ich es umschreiben müsste?

Es war eigentlich meine Absicht das ganze Pattern gierig zu haben, da ich ja will das es mehrmals die a href-Tags ersetzt.

@all
Ich wäre sehr dankbar falls sich jemand erbarmen würde einen Blick über dieses Pattern zu werfen, wo ich den Fehler habe das es sich nich wiederholt??
Jedes Pattern verfolgt einen Zweck (und ist für diesen gut genug), Pattern zu kombinieren ist meistens viel zu viel.
Schauen wir uns das ganze an, Du hast ein URL-Pattern mit einem HTML-Element-Pattern gekreuzt. Was total unnötig ist, weil der regEx-Parser jetzt prüfen muss, ob eine valide URL im href-Attribut drin steht. Ausreichend für den Anwendungsfall wäre jedoch den Fall abzubilden, den HTML hier definiert: Ein Attributinhalt geht von " bis ", dazwischen darf kein " stehen (analog '). Eine URL mit „startet mit http(?): oder ftp: und beinhaltet kein "“ abzubilden, würde hier völlig ausreichen.
Zitat:
Wie könnte ich die RegEx noch so verbessern das die Youtube URL's sowohl in einem a href Tag findet als auch ohne einen?
ist dann wieder ein anderer Anwendungsfall.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Probleme bei einem einfachen Regex smilla PHP Einsteiger 5 14.12.2010 11:38
RegEx für E-Mails (preg_replace) N4bla PHP Tipps 2010 4 18.11.2010 21:53
[Erledigt] Kleine Regex Frage Bubelbub PHP-Fortgeschrittene 8 25.07.2010 23:39
Gdata Youtube (Requests) Programmierung dazzafact Gewerblich 0 22.04.2010 19:59
[Erledigt] regex | variables wort herausfiltern Knechtle PHP Tipps 2010 6 05.03.2010 17:21
Youtube Video beim Play drücken vergrößern reinhardcore Beitragsarchiv 5 29.10.2009 13:48
Array sortieren mit regex Lupi PHP Tipps 2008 3 21.07.2008 15:17
Regex: Auslesen der Meta-Tags einer Webseite Sucheingrenzung pepe24 PHP Tipps 2008 12 31.05.2008 15:41
2 Regex in PHP kompatible Syntax übersetzen NoiZy PHP-Fortgeschrittene 6 07.04.2008 09:04
Regex Link Problem Broadcast PHP Tipps 2008 2 29.02.2008 16:30
[gelöst :D ] regex tuts nur einmal pro zeile notyyy PHP Tipps 2008 17 24.09.2007 15:40
habe ein paar fragen zu REGEX imported_kremser PHP Tipps 2006 11 31.01.2006 15:30
RegEx findet Stringvorkommen nicht PHP Tipps 2007 6 08.12.2005 21:52
Regex für attribute in quelltexten robo47 PHP Tipps 2005 6 27.01.2005 18:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
regex youtube video id, youtube video id filtern regex, youtube kanalseite link, regex video id, $text = preg_replace(\'/<a href=[^>] youtube., html video id z youtube

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:03 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum