• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

eigne url als interne und fremde als externe parse

dertypdernixkan

New member
hallo loidä,

sorry wegen dem titel, mir ist nicht ganz klar wie ich es sonst ausdrücken sollte.

folgendes, ich schreibe noch immer an meinem forum. soweit läuft alles in den grundzügen okay. jetzt geht es um die feinheiten... ich parse mom alle userpostings auf tradtionellem weg. heißt, alle eingaben werden im backend geparst. so wie überall eben ^^

ich finde links die die user mit [*url*] setzen nicht grade schön und es ist nervig für jeden link, videos und bilder dauernd bbc zu bemühen. nun wollte ich eine neue parse-datei erstellen in der das skript meine eigne url, bild-url und youtube-url erkennt.

das mit dem youtube hat geklappt. allerding scheitere ich daran meine eigne als interne und alle anderen als exteren zu setzen! entweder es wird nur ein link als <*a href=**** gestezt oder alle werden nicht als url erkannt oder die url werden als http://http:// gesetzt oder ich hab den link im link :D

all meine bemühungen, in verschiedene richtungen brachten nur teilerfolge... parse_url funktionierte nur wenn wirklich nur 1 link pro posting vorkam.

alle links via array ($matched[0][2] usw) konnten auch nur dann verarbeitet werden wenn es nur eine gestzte url gab.

habt ihr vorschläge?

der ablauf sollte wie folgt sein

1. url finden wenn url dann -> 2. wenn keine weiter

2. gehört url zu meiner domain? wenn ja -> link als class oder id intern setzen

3. gehört url zu youtube -> video ausgeben

4. endet url auf jpg, jpeg, png oder gif img-tag ausgeben

[*b], [*i], [*s], [*u] und [*color] gebe ich weiterhin mit der aktuellen datei aus...
 
Hallo! Ich habe das verschoben, weil es stark nach PHP klingt. Und das hat nichts mit JS zu tun.
Zur Frage: Ich weiß nicht, ob es dafür ein Patentrezept gibt, habe selbst auch keine Ahnung von PHP.
Vielleicht zeigst du ausschnittweise schonmal Code. Ist möglicherweise nur eine Kleinigkeit, die noch fehlt.
 
Hi Mikedoe,

japp, is reines PHP. Danke fürs Verschieben. Hatte wohl (wegen der Uhrzeit) nicht drauf geachtet :D

Also, das aktuelle Parse-Skript sieht wie folgt aus:

BB-Code-Parsing
PHP:
<?php

function parse_art($str) {
         #HTML Zeichen maskieren
         #$str = htmlentities($str);
         #$str = addslashes($str);
         #$str = ltrim($str);
         #$str = chop($str);
         #$str = nl2br($str);
         $str = str_ireplace("\r\n","<br>",$str);

         $str = str_ireplace(':)','<l id="smilie" class="smile" title=":)"></l>',$str);
         $str = str_ireplace(':D','<l id="smilie" class="biglaugh" title=":D"></l>',$str);
         $str = str_ireplace('-.-','<l id="smilie" class="nerv" title="-.-"></l>',$str);
         $str = str_ireplace('::<:','<l id="smilie" class="mad" title=":<"></l>',$str);
         $str = str_ireplace(':{','<l id="smilie" class="sad" title=":{"></l>',$str);
         $str = str_ireplace(':O','<l id="smilie" class="what" title=":O"></l>',$str);
         $str = str_ireplace('})','<l id="smilie" class="evel" title="})"></l>',$str);
         $str = str_ireplace(':(','<l id="smilie" class="tear" title=":("></l>',$str);
         $str = str_ireplace(':|','<l id="smilie" class="oh" title=":|"></l>',$str);
         $str = str_ireplace('<3','<l id="smilie" class="love" title="<3"></l>',$str);

         $str = preg_replace('#\[b\](.*)\[/b\]#isU','<b>$1</b>',$str);
         $str = preg_replace('#\[i\](.*)\[/i\]#isU','<i>$1</i>',$str);
         $str = preg_replace('#\[u\](.*)\[/u\]#isU','<u>$1</u>',$str);
         $str = preg_replace('#\[s\](.*)\[/s\]#isU','<s>$1</s>',$str);
         $str = preg_replace('#\[color=(.*)\](.*)\[/color\]#isU','<font color="$1">$2</font>',$str);
         $str = preg_replace('#\[img\](.*)\[/img\]#isU','<div id="post-img-div"><img id="post-img" src="$1" alt="$1" hight="300" width="600"><div id="show-div"><a href="$1" data-lightbox="image-1">machs mal größer</a></div></div>',$str);
         $str = preg_replace('#\[zitat](.*)\[/zitat\]#isU','<div class="zitat"><span id="zautor">User '.$name_autor.' schrieb</span><br><br><i>$1</i></z></div>',$str);
         $str = preg_replace('#\[code\](.*)\[/code\]#isU','<div class="code"><span id="code-span">Code:</span><br>$1</div>',$str);
         $str = preg_replace('#\[spoiler\](.*)\[/spoiler\]#isU','<div class="spoilerbox"><a id="gb" class="spoilertoggle">Spoiler auf</a><div class="spoiler">$1</div></div>',$str);

         $str = str_replace('www.','http://www.',$str);
         $str = str_replace('http://http://www.','http://www.',$str);
         $str = str_replace('https://http://www.','https://www.',$str);
         $str = preg_replace('/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i','<a href="$1">$1</a>', $str);

         return ($str);
}
?>


Ich lege mal den Youtube-Parser hinterher. Das ist aber noch sehr rudimentär, in dieser Datei habe ich versucht, Bild-URL zu erkennen. Bitte nicht lachen :D

PHP:
<?php

function autolink($str){

         $str = str_ireplace('www.','http://www.',$str);
         $str = str_ireplace('http://http://www.','http://www.',$str);
         $str = str_ireplace('https://http://www.','https://www.',$str);

         $reg_exUrl = '/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i';
         $m = preg_match_all($reg_exUrl, $str, $match);

         if($m){
                 $links = $match[0];
                 for($i = 0; $i < $m; $i++){
                         if(substr($links[$i], 0, 18) == 'http://www.youtube'){
                                 $str = str_replace($links[$i],'',$str).'<br><iframe width="550" height="320" src="http://www.youtube.com/embed/'.substr($links[$i], -11).'" frameborder="0" allowFullScreen></iframe><br>';

                         #}elseif($str = substr(strrchr($links[$i], '.'), 1) == 'jpg'){
                                 #$str = '<img src="'.$links[$i].'" width="100" height="100">';

                         #}elseif($str = substr(strrchr($links[$i], '.'), 1) == 'jpeg'){
                                 #$str = '<img src="'.$links[$i].'" width="100" height="100">';

                         #}elseif($str = substr(strrchr($links[$i], '.'), 1) == 'png'){
                                 #$str = '<img src="'.$links[$i].'" width="100" height="100">';

                         #}elseif($str = substr(strrchr($links[$i], '.'), 1) == 'gif'){
                                 #$str = '<img src="'.$links[$i].'" width="100" height="100">';

                         }else{
                                 $str = str_replace($links[$i],'<a href="'.$links[$i].'" target="_blank">'.$links[$i].'</a>',$str);
                         }
                 }
         }
         return ($str);
}

#$str = 'http://images.tagseoblog.de/bilder/bild-foto/bild.jpg';
#$str = 'http://localhost/kategorie/beitraege/cid-pr/tid-1/go-2#post30';
#echo autolink($str);
?>
 
Ich denke, es wäre einfacher, du würdest den Code soweit reduzieren, dass er nur noch die Problemfälle beinhaltet, die nicht laufen wie du möchtest.
 
von der möglichkeit, bilder ohne bb-code auszugeben bin erstmal zurückgewichen. ich denke da reichen meine fähigkeiten noch nicht -.-

die in der youtube-parse-datei mit # beginnend sind erstmal deaktiviert da so keine links sondern immer bilder ausgegeben werden sofern sich bilder im post befinden.

die erste datei läuft ja problemlos...

wie gesagt, ich kann vereinzelt url soweit prüfen. nur kommt eine weitere, fremde url hinzu stimmt nix mehr! -.-
 
Was ist den <l> für ein Tag? Das gibt es in HTML nicht!

Auch wirst du mit einem String-Replace Ansatz nicht glücklich werden. Einige Dinge kann man damit einfach nicht machen (z.B. invalide BB-Codes erkennen und verwerfen). Da wirst du ziemlich sicher nicht um einen Parser herumkommen.

Zudem müssen URLs nicht mit einem "www." beginnen. Schau' dir doch nur die URL vom Forum an...

Bei deinem Problem kann ich gerade nicht 100%ig nachvollziehen, warum das nur eine URL fängt. Bei mir "funktioniert" das auch bei mehreren URL. Zeig' doch mal einen Teststring, den du auf die Funktion losgelassen hast.
 
Was ist den <l> für ein Tag? Das gibt es in HTML nicht!

Das ist ein eigener html-Tag. Nach html5 ist es möglich eigene zu erstellen. Für alle IE Versionen unter 10 habe ich ein JS was dem Browser mitteilt dies wie einen normalen Tag zu behandeln. (Probleme mit dem Validator sind mir recht egal, der macht schon bei while-Schleifen grobe Fehler)

Der beste Beweis, es funktioniert und wird sogar vom IE 6 richtig dargestellt :D

Auch wirst du mit einem String-Replace Ansatz nicht glücklich werden. Einige Dinge kann man damit einfach nicht machen (z.B. invalide BB-Codes erkennen und verwerfen). Da wirst du ziemlich sicher nicht um einen Parser herumkommen.

Dabei geht es ja nicht um die BB-Codes selber. Da nutze ich die normalen Codes.


Zudem müssen URLs nicht mit einem "www." beginnen. Schau' dir doch nur die URL vom Forum an...

Stimmt. Eure URL sieht so aus:
Code:
http://forum.jswelt.de/serverseitige-programmierung/

Wie Du weiteroben siehst, habe ich 3 Zeilen die die URLs auf richtigen Syntax drehen. Bis jetzt habe ich damit keine Fehler feststellen können. Sowohl
Code:
http://forum.jswelt.de/serverseitige-programmierung/
als auch
Code:
http://www.forum.jswelt.de/serverseitige-programmierung/
leiten zur richtigen Seite um.


Bei deinem Problem kann ich gerade nicht 100%ig nachvollziehen, warum das nur eine URL fängt. Bei mir "funktioniert" das auch bei mehreren URL. Zeig' doch mal einen Teststring, den du auf die Funktion losgelassen hast.

Momentan sieht es so aus:

so fange ich urls zu youtube ab

PHP:
<?php

function autolink($str){

         $str = str_ireplace('www.','http://www.',$str);
         $str = str_ireplace('http://http://www.','http://www.',$str);
         $str = str_ireplace('https://http://www.','https://www.',$str);

         $reg_exUrl = '/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i';
         $m = preg_match_all($reg_exUrl, $str, $match);

         if($m){
                 $links = $match[0];
                 for($i = 0; $i < $m; $i++){
                         if(substr($links[$i], 0, 18) == 'http://www.youtube'){
                                 $str = str_replace($links[$i],'',$str).'<br><iframe width="550" height="320" src="http://www.youtube.com/embed/'.substr($links[$i], -11).'" frameborder="0" allowFullScreen></iframe><br>';

                         }else{
                                 # wenn nicht youtube dann normalen link ausgeben, funktioniert immer!
                                 $str = str_replace($links[$i],'<a href="'.$links[$i].'" target="_blank">'.$links[$i].'</a>',$str);
                         }
                 }
         }
         return ($str);
}
?>

Und in dieser Version habe ich versucht, über ein Arry die URL abzufangen und bei Bedingung true einen Link zu generieren der auf eigne Seiten verweist. Sofern ein Link im String vorkommt geht es, kommt ein weiterer hinzu wird das nicht mehr erkannt. Was auch logisch ist da sich das Arry ändert. Aber ich kann nicht für jeden Link eine Möglichkeit anlegen...

Btw. diese Version ist wirklich sehr rudimentär, lachen verboten :D

PHP:
<?php
         error_reporting(E_ALL);

         function linkcheck($text){
                 $search = '/^([a-z]+:\/\/)(.+\/)(.*)$/i';
                 $anzahl = preg_match_all($search, $text, $match, PREG_SET_ORDER);
                 for($i = 0; $i < $anzahl; $i++){
                         print_r ($match);

                         if($match[0][2] == 'localhost/sektion/mitglieder/'){
                                 $text = '<a href="'.$match[0][0].'" style="font-weight:bold;">zum Profil von '.$match[0][3].'</a>';
                                 return $text;

                         }elseif($match[0][2] == 'localhost/'){
                                 $text = '<a href="'.$match[0][0].'" style="font-weight:bold;">Hauptseite</a>';
                                 return $text;

                         }elseif($match[0][2] == 'localhost/settings/'){
                                 $text = '<a href="'.$match[0].'">Accounteinstellungen</a>';
                                 return $text;

                         }elseif($match[0][2] == 'localhost/unloads/'){
                                 $text = '<a href="'.$match[0][0].'">Testordner</a>';
                                 return $text;

                         }else{
                                 $text = str_replace('www.','http://www.',$text);
                                 $text = preg_replace('/([\w]+:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/i','<a href="$1">$1</a>', $text);
                         }
                 }
         return $text;
         }

         $text = 'http://localhost/sektion/mitglieder/Testuser1 http://localhost/sektion/mitglieder/Testuser2';
         echo linkcheck($text);
?>
 
Zurück
Oben