Agi
Nabend.
Ich hab ein Problem und komm bei dem seit Stunden nicht weiter ...
Ich habe einen Text (abgeschickt via Formular) und möchte nun mittels PHP prüfen, ob es in diesem Text URLs gibt.
Falls URLs vorhanden sind, sollten die in <a href="$url">$url</a> umgewandelt werden.
Kann mir da jemand nen Tipp geben, wie man das am besten lösen könnte?
DrPCox
ich hab mal etwas gegrübelt und bin auf die schnelle auf das hier gekommen:
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
|
<?php
$text = $_POST['url'];
$http = 'http';
$de = 'de';
$startpos = strpos($url, $http);
$start = substr($url, $startpos, 9999);
$endposde = strpos($start, $de) + 2;
$endde = substr($start, 0, $endposde);
echo '<a href="'.$endde.'">'.$endde.'</a>';
?> |
|
$text = holt per post die eingabe vom textfeld
$http und $de sind nur platzhalter
$startpos = ermittelt per strpos an welchem punkt der eingabe http beginnt.
$start = gibt die eingabe ab $startpos aus (für maxial 9999 zeichen..sollte reichen^^)
$endposde = ermittelt per strpos an welchem punkt von $start "de" auftaucht. und erhöht den wert um zwei um das "de" miteinzuschließen
$endde = kürzt $start bis zur in $endposde ermittelten stelle (die url ist ausgelesen)
echo ist klar.
---------------------------
ich habe das jetzt mal so kurzerhand zusammen gecodet und es funktioniert auch. allerdings kann man bisher nur nach de-domains suchen, aber mit nem array lässt sich auch das ja lösen^^
EDIT
mir ist gerade aufgefallen, dass das script nur die erste url aus der eingabe wiedergibt. wenn mehrere enthalten sind, wird der rest ignoriert..naja..vielleicht dient es immerhin als denkhilfe^^
24Bytes

Die Lösung ist zu geil
Die "richtige" / "bessere" Lösung lautet:
REGEX (natürlich nur meine Ansicht)
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
|
$message = "Hallo,
das ist eine Test Nachricht https://test.de mit mehreren urls http://test.de ob mit
http oder https und auch egal ob
mit http://www.lala.de oder https://blub.lala.com ;) verstehen?! :D";
$message = trim(preg_replace("#(http|https)://(.*) #siU", '<a href="${1}://${2}" target="_blank">${2}</a> ', $message . " "));
/**
* ich haeng zuerst ein leer zeichen dran, und machs
* danach mit trim wieder weg, geht bestimmt auch besser,
* aber ich habs auf die schnelle so gemacht, damit auch eine url
* erkannt wird, die am ende des textes steht (weil laut diesem regex,
* eine url von einem leerzeichen gefolgt sein muss)
*/
echo $message; |
|
DrPCox
aber darf ich mal fragen, warum du meine lösung auslachst? ja, ich bin noch nicht soo vertraut mit php und mysql, aber ich versuche zu helfen. dass du es besser kannst, ist ja schön und finde ich bewundernswert, aber respekt ist auch ne feine sache.
24Bytes
hm das war kein auslachen ... ich mache auch oft dinge die um einiges komplizierter sind, als sie eigentlich sein müssen. man kann ja auch nie alles wissen. ich fand das halt nur witzig, wie du es lösen würdest ... (im übrigen, lache ich auch über mein eigenen code auch, wenn erst mal nen bissl. zeit vergangen ist

) also, net bös nehmen
DrPCox
ja..sorry auch wenn meiner reaktion. nur irgendwie hatte ich mich etwas in dem code verrant und war froh, dass er überhaupt funktioniert hat
Agi
Hi danke euch beiden.
Aber die Lösung von 24Bytes funktioniert doch wesentlich besser und reibungslos, drum hab ich mich für diese entschieden.
Aber noch ne zusätzliche Frage: Wie müsste der Befehl aussehen, wenn er
auf <a href="http://www.url.de">www.url.de</a> umwandeln soll?
Hab schon selbst ein wenig versucht, aber da wandelt er dann alles ab
www. bis zum Textende um:
php: |
1:
|
$message = trim(preg_replace("#(www.)(.*) #siU", '<a href="http://${1}${2}">${1}${2}</a> ', $message . " ")); |
|
Hawkes
Warum nicht mal bei den Profis spicken. Hab das hier mal aus dem WCF ausgekoppelt (Lizenz LGPL):
php: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
$test="www.url.de";
$urlPattern = '~(?<!\B|"|\'|=|/|\]|,|\?)
(?: # hostname
(?:ftp|https?)://[^\x0-\x2C\x2E\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+(?:\.[^\x0-\x2C\x2E\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+)*
|
www\.(?:[^\x0-\x2C\x2E\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+\.)+
(?:[a-z]{2,4}(?=\b))
)
(?::\d+)? # port
(?:
/
[^!.,?;"\'<>()\[\]{}\s]*
(?:
[!.,?;(){}]+ [^!.,?;"\'<>()\[\]{}\s]+
)*
)?
~ix';
$message = preg_replace($urlPattern, '<a href="\\0">\\0</a>', $test); |
|
Damit dürftest du so zeimlich alle Fälle abdecken können
Agi
Das klappt prima, danke dir. ^^
24Bytes
Zitat: |
Original von Admiral_Hawkes
Warum nicht mal bei den Profis spicken. |
Weil auch "Profis" Fehler machen.
Zitat: |
Original von Admiral_Hawkes
Damit dürftest du so zeimlich alle Fälle abdecken können
|
www.testdomain.museum klappt nicht, die haben eine "Begrenzung" drin, das die Domainendung max. 4 Zeichen lang sein darf
php: |
1:
|
(?:[a-z]{2,4}(?=b)) |
|
ersetzen durch
php: |
1:
|
(?:[a-z]{2,6}(?=b)) |
|
Hawkes
.museum kannte ich gar nicht
Werds mal im WSF melden.