Links und E-mails automatisch erkennen und klickbar machen
Fabian
- php
0 Hartmut R.0 Fabian0 Henryk Plötz0 Fabian0 Henryk Plötz0 Fabian
Hallo Forumgemeinde,
heute Mittag habe ich bereits eine Anfrage gestellt und dabei gute Antworten erhalten. Jedoch hat die eine und andere funktionalität gefehlt.
Auf meiner Suche nach weiteren Lösungen bin ich auf die PHP-Mail_Archiv gestoßen. Hier wurde eine sehr gute Lösung mit vielen Funktionen gepostet.
Leider versuche ich schon seit Stunden vergebens, die Funktion mit PHP 4 auf meinem System zum Laufen zu bringen. Schon in der zweiten Zeile zeigt er bei mir die erste Fehlermeldung an.
Ich glaube das hängt mit dem 3D zusammen, was auch immer das heißen mag?
Für einen kleinen Tipp oder eine Lösungshilfe wäre ich sehr dankbar, dass ich das Kapitel "Links automatisch matchen" enldich beenden kann.
Danke und Grüße aus Braunschweig
Fabian
____________________________________________________
Markus Smigelskis php@phpcenter.de
Thu, 02 Aug 2001 00:18:24 +0200
Previous message: [php] Link als link ersetzen
Next message: [php] Link als link ersetzen
So sieht soweit ganz gut aus. Ist zwar nicht das schönste und
sauberste, scheint aber sauber zu funktionieren :-)
Wer Verbesserungen, nur immer her damit. Wenn man fit in Regulären
Ausdrücken wäre ließe sich das ganze bestimmt auch nocheinmal ne
nummer eleganter lösen.
Hänge jetzt einfach mal meine Version drann, die soweit ganz gut
funktioniert.
CU Markus
<?
function replace_uri($str) {
$pattern = 3D'#(^|[^"=3D]{1})(http://|mailto:)([^\s<>]+)([\s\n<>]|$)#sm';
return preg_replace($pattern,"\1<a href=3D"\2\3"><u>\2\3</u></a>\4",$str);
}
function sp($str, $searchTerm){
if (!is_string($searchTerm)) return 0;
if (is_array($searchTerm)) return 0;
if (!$searchTerm) return 0;
return strpos(chr(31).$str, $searchTerm);
}
function ssp($str, $searchTerm){
//this adds case insensitivity
return sp(strToLower($str), $searchTerm);
}
function add_space($str) {
$str =3D str_replace('. ', ' . ', $str);
$str =3D str_replace(', ', ' , ', $str);
$str =3D str_replace(".\n", " .\n", $str);
$str =3D str_replace(",\n", " ,\n", $str);
return $str;
}
function sub_space($str) {
$str =3D str_replace(' . ', '. ', $str);
$str =3D str_replace(' , ', ', ', $str);
$str =3D str_replace(" .\n", ".\n", $str);
$str =3D str_replace(" ,\n", ",\n", $str);
return $str;
}
function add_http($str) {
if (!ssp($str, 'www.')) return $str;
$str =3D str_replace('www.', '<A HREF="http://www.',">http://www.',</A> $str);
return str_replace('<A HREF="http://http://',">http://http://',</A> '<A HREF="http://',">http://',</A> $str);
}
function add_mailto($str){
if (!sp($str, '@')) return $str;
$ar =3D explode(' ', $str);
while(list($key, $val) =3D each($ar)) {
if (sp($val, '@') && !ssp($val, 'mailto')){
$ar[$key] =3D 'mailto:' . $val;
}
}
return implode(' ', $ar);
}
function sub_http($str) {
if (!ssp($str, '>http:')) return $str;
$str =3D str_replace('><A HREF="http://',">http://',</A> '>', $str);
return $str;
};
function sub_mailto($str) {
if (!ssp($str, '>mailto:')) return $str;
$str =3D str_replace('>mailto:', '>', $str);
return $str;
};
$inhalt =3D"www.xyz.de, www.zyx.com,\n <A HREF="mailto:info@xyz.de">info@xyz.de</A>\n adhoifhosd
<A HREF="http://www.xyz.de">http://www.xyz.de</A> sdhfio";
echo $inhalt."<hr>";
$inhalt =3D add_http($inhalt);
echo $inhalt."<hr>";
$inhalt =3D add_mailto($inhalt);
$inhalt =3D add_space($inhalt);
echo $inhalt."<hr>";
$inhalt =3D replace_uri($inhalt);
$inhalt =3D sub_space($inhalt);
echo $inhalt."<hr>";
$inhalt =3D sub_http($inhalt);
echo $inhalt."<hr>";
$inhalt =3D sub_mailto($inhalt);
echo $inhalt."<hr>";
?>
Hallo Fabian,
Leider versuche ich schon seit Stunden vergebens, die Funktion mit PHP 4 auf meinem System zum Laufen zu bringen. Schon in der zweiten Zeile zeigt er bei mir die erste Fehlermeldung an.
Also muss es auch einen Fehler in der zweiten Zeile geben: Du rufst die Funktion "preg_replace" auf. Die gibt es aber nicht in PHP, die musst du in den Skripten, die du dir da zusammengesammelt hast, suchen und einbauen.
MfG
Hartmut R.
Danke Hartmut für deine Anwort.
Ich habe nochmal nachgeschaut. Im PHP Manual ist die Funktion zu finden:
preg_replace
(PHP 3>= 3.0.9, PHP 4 >= 4.0.0)
preg_replace -- Perform a regular expression search and replace
Description
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
Wenn ich die Zeile umschreibe mit "" in $pattern ="3D...."; dann zeigt er zumindest in dieser Zeile keinen Fehler mehr an.
Aber für das weitere funktionieren kommt er, warum auch immer, nicht um das 3D herum...
Grüße aus Braunschweig
FAbian
Moin,
Also muss es auch einen Fehler in der zweiten Zeile geben: Du rufst die Funktion "preg_replace" auf. Die gibt es aber nicht in PHP, die musst du in den Skripten, die du dir da zusammengesammelt hast, suchen und einbauen.
Hilfe, ich habe Halluzinationen: http://www.php.net/manual/de/function.preg-replace.php :)
Fabian: Der richtige Fehler liegt wie du schon vermutet hast ganz wo anders. Ich nehme an dass das eine eMail ist die als Quoted-Printable bei dir angekommen ist, und dein Mailclient kaputt ist und das nicht wieder wegmachen kann.
Bei Quoted-Printable werden alle komischen Zeichen (Umlaute und so) durch ein Istgleichzeichen, gefolgt von dem Hexcode des Zeichens ersetzt. Das hat zur Folge dass man natürlich auch das Istgleichzeichen ersetzen muss.
Also such einfach alle Vorkommen von =3D und ersetz sie durch =
Wenn da noch andere Vorkommen von =xx (und xx zwei beliebige Hex-Zahlen) dann musst du sie auch durch das entsprechende Zeichen ersetzen: In Selfthml ist irgendwo ein Hexadezimal-nach-Dezimal-Umrechner und eine dezimale Zeichentabelle, die helfen dabei.
--
Henryk Plötz
Grüße aus Berlin
Hallo Henry,
erneut ein großes Dankeschön in die Hauptstadt.
Ich habe gestern schon früh Feierabend gemacht, daher erst jetzt meine Antwort. Eigentlich wollte ich schreiben, dass nun alles funktioniert aber nun sitze ich schon wieder den ganzen Morgen an dem Ding.
Die falsche Codierung war zumindest ein Fehler. Ich habe den Code aus einem PHP-Email Archiv kopiert und in meine Seite eingefügt.
http://lists.phpcenter.de/pipermail/php/Week-of-Mon-20010730/009863.html
Leider geht das Script jedoch noch immer nicht.
Die Funktion:
function add_http($str) {
if (!ssp($str, 'www.')) return $str;
$str = str_replace('www.', '<A HREF="http://www.',">http://www.',</A> $str);
return str_replace('<A HREF="http://http://',">http://http://',</A> '<A HREF="http://',">http://',</A> $str);
}
Meldet immer einen Fehler. Wenn ich diese Funktion deaktiviere,
erhalte ich einen Fehler in der Testzeile:
$inhalt ="www.xyz.de, www.zyx.com,\n <A HREF="mailto:info@xyz.de">info@xyz.de</A>\nadhoifhosd <A HREF="http://www.xyz.de">http://www.xyz.de</A> sdhfio";
Die Testzeile wird wahrscheinlich schon aufgrund der " bei HREF nicht geparst werden können. Vielleicht ist das der gleiche Grund wie bei der o.g. Funktion.
Desweiteren dachte ich immer, es gibt nur drei Elemente bei str_replace. Trotz aller Überlegungen komme ich jedoch min auf ca. 4 Elemente bei dieser Funktion.
Kann das etwa auch daran liegen, dass das Script evtl. für PHP3 geschrieben wurde?
Nocheinmal vielen Dank und Grüße aus Braunschweig
Fabian
Moin,
Leider geht das Script jedoch noch immer nicht.
Die Funktion:
function add_http($str) {
if (!ssp($str, 'www.')) return $str;
$str = str_replace('www.', '<A HREF="http://www.',">http://www.',</A> $str);
return str_replace('<A HREF="http://http://',">http://http://',</A> '<A HREF="http://',">http://',</A> $str);
}
Meldet immer einen Fehler.
Jo, da fehlt auch mindestens ein ". Aber ich sehe da auch nicht wirklich was hier gemeint sein soll, und würde den Code als broken beyond repair einstufen.
Kann das etwa auch daran liegen, dass das Script evtl. für PHP3 geschrieben wurde?
Öhm, ich habe mit PHP3 nie gearbeitet aber ich kann mir kaum vorstellen dass sich da etwas verändert haben soll das alte Skripte vollkommen unnütz macht. Aber du hast doch schon Lösungen gekriegt die nur mehr oder weniger Korrekte URLs rausfischen und das wäre glaubich das einzig Wahre. Diese Version für tippfaule bringt IMHO wesentlich mehr Probleme als sie löst, weil sie zum Beispiel auch auf Aussagesätze a la "Das finden Sie alles im www." anspringt. Ausserdem würden dann die Normaluser auch endlich mal lernen (müssen) dass ein http-URL nunmal mit http:// anfängt. ;-)
--
Henryk Plötz
Grüße aus Berlin
Moin Henryk,
danke für deine schnelle Antwort.
Ich werde mir deine Antwort noch einmal zu Herzen nehmen und meine Strategie überdenken. Vielleicht lasse ich das ganze mit dem www. und der User sollte wirklich nur http://www. eingeben können.
Danke und Grüße
aus Braunschweig