HalloPHP

Doppeltes http:// oder Re: entfernen

Reguläre Ausdrücke | letzte Änderung am 25. April '10 um 10:55 Uhr

Problemstellung

Für ein Benutzerprofil möchten wir dem Besucher erlauben, die Adresse seiner Website anzugeben. Für das Eingabefeld geben wir dem User eine Hilfe über das value="" - Attribut vor:

<input type="text" name="website" value="http://" />

Im Feld wird also bereits das http:// für die Url angezeigt. Unglücklicherweise kopiert der User lediglich die Url aus der Addresszeile seine Browsers und hängt eine zweite Protokollangabe an die Vorgabe im Eingabefeld. Die resultierende Adresse sähe also beispielsweise so aus

http://http://www.domain.de

und die Website daraufhin nicht erreichbar.
Dies möchten wir mit einem regulären Ausdruck verhindern.

Eine weitere Anwendung für einen solchen Ausdruck könnte auch ein PN-System sein. User, die eine private Nachricht erhalten haben, wollen möglichst schnell antworten. Dabei bleibt der Titel der Nachricht meist erhalten. Um zu kennzeichnen, dass es sich dabei um eine Antwort auf eine Nachricht handelt, fügen wir wieder über das value="" - Attribut die Angabe Re: hinzu. Bei sehr vielen Antworten würde jedesmal ein Re: hinzugefügt werden und den Titel unübersichtlich lang machen. Daher möchten wir auch diesen Präfix jedesmal abschneiden.

Problemfall: http://

In unserem Ausdruck selektieren wir zuerst die Folge http:// und sämtliche Widerholungen wie http://http:// oder sogar http://http://http://. Den Rest der Url gruppieren wir, da wir diesen unverändert weiterverwenden möchten. Unseren String ersetzen wir dann durch ein einfaches http:// und den gruppierten Teil unserer Domain.

<?php
$url 
'http://http://google.de';
echo 
preg_replace('/^(?:http:\/\/)*(.*)$/''http://\1'$url);

Problemfall: PN-System und Re:

Dieser Ausdruck ist ganz ähnlich aufgebaut, wie der Ausdruck für die Url-Prüfung. Hier müssen wir lediglich noch ein paar Leerzeichen und die Groß- und Kleinschreibung beachten.

<?php 
$string 
'Re: RE:    Hallo';
echo 
preg_replace('/^(?:re:\s*)*(.*)$/i''Re: \1'$string);

Antworten

nikosch | verfasst am 14. Juli '10 um 18:31 Uhr

#1

Bei Zweiten sehe ich den Anwendungsfall nicht. Für URLs finde ich das Verfahren falsch. Solche Doppelungen würde ich rigoros ablehnen. Zudem würde ich aber auch das Feld nicht vorbelegen, sondern einen Hilfstext wie „Bitte mit http://“ ergänzen ODER eher später das http:// ergänzen. ABER und WEIL: Ich finde man kann den Nutzer ruhig dazu erziehen, http:// zu benutzen. Das ist nunmal Teil der Adresse. Ich rate ja auch nicht die PLZ zur Anschrift. Natürlich sollte man ihm dann nicht zusätzlich das Copy&Paste erschweren.

Asipak | verfasst am 15. Juli '10 um 10:35 Uhr

#2

Ich weiß nicht, ich denke, dabei geht es um Bequemlichkeit. Je nach Anwendung gibt es genug User, die sich um etwas, wie die Angabe des Protokolls, keine Gedanken machen. Wird in den Medien eine neue Internetseite beworben, findet man auch lediglich die Angabe der Domain ohne http://. "Besuchen Sie www.example.com", wobei nicht mal das www. immer notwendig ist. Auch das hat sich fest in den Köpfen vieler Menschen verankert.

Womit du Recht hast ist

Quote:
ODER eher später das http:// ergänzen.

Das wäre wohl die bessere Alternative, ich denke, das erwähne ich im Artikel noch und schubse die Leser in diese Richtung.

[edit] Wobei, im Grunde tut der Ausdruck ja genau das. Er gruppiert die Protokollangabe und die Domain, fügt dann aber lediglich vor der Domain eine einzige Protokollangabe hinzu. Ich habe dazu noch den Quantifier + durch * ersetzt. Dann erfüllt er wohl auch deine Anforderungen ;)

Das zweite Beispiel, du kannst es dir vielleicht schon denken, ist bei einem PN-System zum Einsatz gekommen. Das schmale Design der Website ließ es nicht zu, sonderlich viele Re: anzuzeigen, wenn sich User über PN miteinander unterhalten. Das würde zu endloslangen Nachrichten führen, die mit (Re:)+ beginnen. Wie sinnvoll das ist, weiß ich nicht. Immerhin möchte man ja vielleicht auch wissen, die wievielte Nachricht das ist, die man zurückbekommt, um die Unterhaltung zurückverfolgen zu können.
Im Grunde wollte ich damit aber auch nur ein weiteres Beispiel für die Anwendung eines solchen Ausdrucks vorstellen. Ob man dies für sein Projekt gebrauchen kann, ist eine andere Frage.

Danke für deine Meinung ;)

nikosch | verfasst am 15. Juli '10 um 13:41 Uhr

#3

Man könnte vielleicht ein "Re(47): ..." draus machen..

Bequemlichkeit, gut, ich finde aber, wenn ein Affenform ordentlich funktioniert und auch die Fehler deutlich benennt, kann man das ruhig mal riskieren. Anders ist das bspw. bei der TAZ, wo regelmäßig Kommentare mit der Vorbelegung "Ihren Kommentar hier eingeben" beginnen. Gut, ist jetzt nicht ganz dasselbe...