Antworten auf deine Fragen:
Neues Thema erstellen

Strpos Suchposition von bis

Indium1

Nicht mehr ganz neu hier

Hallo an alle Leser,

ich möchte gerne Wörter in einem BBCode String mit strpos und OR Operator suchen:

Kurzbeispiel ohne rawlurlencode:


PHP:
  $url = trim($treffer[1]);
  $linkname = trim($treffer[1]);
   
  if ((strpos($url, 'http://') === false) OR ( strpos($url, 'ftp://') === false )) 
  {
  $ergebnis = $linkname;
  return $ergebnis;
  }
  else 
  {
  $ergebnis = "<a href=\"".$url."\" target=\"_blank\">".$linkname."</a>";
  return $ergebnis;
  }
Wenn ein Wort gefunden wurde wird daraus ein klickbarer Link erstellt, wenn nicht wird die Url ohne Tags ausgegeben.

Mein Problem ist, dass ich noch prüfen muss wo z.B. http:// an eine bestimmte Position zu finden ist. Wie bekomme ich das jetzt hin das strpos nur an bestimmte Positionen sucht.

Beispiel:

http:// muss bei Position 0 anfangen und bei Position 6 enden.
ftp:// muss bei Position 0 anfangen und bei Position 5 enden.

Ich hoffe dass Ihr mich einigermaßen verstanden habt.

Vielen Dank schon mal für eure Antworten!

Mit freundlichen Grüßen,

Indium1
 
Zuletzt bearbeitet:

ChrisvA

Aktives Mitglied

AW: Strpos Suchposition von bis

Ich verstehe zwar nicht, was du genau mit den Positionen meinst, aber für soetwas bietet sich eine Funktion wie preg_replace an, die ersetzt einem ganze Zeichenketten und kann dabei vorhandene Teile wieder einbinden.
 

Zampano_

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hi,

wenn du die gesuchten Zeichenketten NUR am Anfang des Strings haben möchtest, dann kannst du dir z.B. die ersten Zeichen von deinem String schnappen und das Ergebnis vergleichen:

PHP:
if (substr($url,0,7) == 'http://' || substr($url,0,6) == 'ftp://' )  {
   echo "Habe http bzw. ftp am Anfang des Strings gefunden";
}
 

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo ChrisvA,
hallo Zampano_,

vielen Dank für Eure Antworten und Tipps!

Substr war genau das was ich gesucht habe.

Danke nochmals!

Freundliche Grüße,

Indium1
 

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano_,
hallo an alle anderen Leser,

Entschuldigung aber ich brauche doch noch mal deine bzw. eure Hilfe.

Es ist doch bestimmt möglich, alle gesuchten Wörter in ein Array zu schreiben und dann mit substr abzugleichen. Damit würde man etliche logische ODER Operatoren (||) sparen und das Script wäre um einiges schlanker.

Beispiel:

PHP:
   $suche_protokoll = array(
   'http://',
   'https://',
   'ftp://'
);
Ich weiß jetzt aber nicht wie ich das mit der Ermittlung des ersten und des letzten Zeichens umsetzen soll (Beispiel: http:// 0,7 ftp:// 0,6), da ja das letzte gesuchte Zeichen sich an unterschiedliche Stellen befinden kann. Der integer start 0 kann ja bei substr direkt angegeben werden aber wie mache ich das beim integer length?

Außerdem weiß ich nicht, ob man einfach mit substr auf ein Array zugreifen kann, da die Ausgabe ja ein String ist. Ich glaube, dass dabei einem die Fehlermeldung Array to String conversion um die Ohren fliegt.

Ich hoffe dass Du bzw. Ihr zu meinem Problem einen Lösungsansatz parat habt.

Vielen Dank im Voraus und freundliche Grüße,

Indium1
 

Zampano_

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Naja, du könntest dein Array 2-dimensional aufbauen und den Vergleich in einer Schleife machen:

PHP:
$suche_alle_protokolle = array();
$suche_alle_protokolle[0]["needle"] = 'http://';
$suche_alle_protokolle[0]["length"] = 7;

          $suche_alle_protokolle[1]["needle"] = 'https://';
$suche_protokolle[1]["length"] = 8;
  
$suche_alle_protokolle[2]["needle"] = 'ftp://';
$suche_alle_protokolle[2]["length"] = 6;


foreach ($suche_protokoll as $suche_protokoll) {
 if (substr($url,0,$suche_protokoll["lenght"]) == $suche_protokoll["needle"]) {
  echo 'Hab einen gefunden!';
 }
}


Ob das jetzt für dich die passenste Logik ist, kann ich nicht entscheiden, da ich nicht ganz genau weiß was du vor hast.
Was passiert denn eigentlich wenn die URL in der Mitte des Strings ist, ist die dann für dich uninteressant?
Ansonsten würde sich hier dann doch mal ein Blick auf preg_match lohnen.
;)

 
Zuletzt bearbeitet:

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano_,

vielen, vielen Dank für das Beispiel. :)


Habe es zwar noch nicht getestet, aber vom Aufbau her scheint es schon das richtige zu sein.


Ob das jetzt für dich die passenste Logik ist, kann ich nicht entscheiden, da ich nicht ganz genau weiß was du vor hast.
Ich versuche es Dir zu erklären was ich vorhabe:

Es handelt sich um eine Bildergalerie, wo jedes Bild einen eigenen Text mitbekommen könnte (nennen wir es mal Bildbeschreibung). In diesem Text können URLs z. B. zu anderen Internetseiten enthalten sein. Diese URLs sollten eigentlich ohne BBCode per Script ermittelt und bei Treffer automatisch klickbar gemacht werden. Nach langen ausprobieren bin ich zum Schluss gekommen, dass die automatische Suche und Umwandlung nicht immer das Ergebnis liefert was man sich wünscht. Bei zum Beispiel einen Satz wie:

Schreibe einfach https:// an den Anfang!

wird https:// als URL erkannt und klickbar gemacht was natürlich nicht sein darf. OK, das könnte man ja noch mit preg_match umgehen.

Problematisch wird es aber bei URLs mit Leerzeichen wie Beispielsweise:

Hallo hier ist der Link test/dokument text.txt für dich.

Bei allen Regexen die ich bis jetzt gestestet habe war beim ersten Leerzeichen Schluss und nur die hälfte der URL war anklickbar. Das sieht nicht nur unschön aus sondern schießt auch völlig am Ziel vorbei. Ich weiß dass man Leerzeichen in Links eigentlich vermeiden sollte, dennoch halten sich viele im weiten WWW nicht daran. In Microsoft Word Dokumenten wird solch eine Zeichenfolge als Link erkannt, nur nützt mir das nichts, da ich nicht an die Regex drankomme, geschweige diese irgendwie mit PHP verarbeiten könnte wenn ich sie hätte.

Von daher habe ich mich entschlossen, auch wenn es irgendwann Datenbank lastig wird und User unfreundlich wirkt mit BBCodes für URLs zu arbeiten. Es sei denn, Du hast da noch was in petto.


Was passiert denn eigentlich wenn die URL in der Mitte des Strings ist, ist die dann für dich uninteressant?


Nein, das wäre wie vorher schon aufgeführt sehr Interessant, vorausgesetzt man bekommt eine automatische Erkennung sowie Umwandlung hin, da es sehr viele Möglichkeiten gibt eine URL zu schreiben.

Beispiele:

http://www.example.com
http://www.example.com/leerzeichen test/dokument text.txt
http://www.example.com/test/test.php?variable=1,2,3,4,5
http://de.wikipedia.org/
http://de.wikipedia.org/wiki/Iron_Man_(Film)
etc. pp.

Gleiches gilt für HTTPS, FTP, FTPS und SFTP wobei die letzten drei noch ein @ enthalten könnten. Da auch E-Mail Adressen veröffentlicht werden können, kann das zu Problemen mit z. B. FTPs führen.

Bei BBCode ist die Sache Skript-technisch einfacher zu Bewerkstelligen, meine ich zumindest. Tag url steht für den Anfang und Tag /url steht für das ende der URL. Wenn jetzt jemand am Anfang im BBCode ein Leerzeichen oder ein Tabulatorzeichen eingibt, dann wird das Zeichen mit trim entfernt. Https://, http:// etc. würde daher bei Position 0 anfangen, vorausgesetzt es wird wirklich eingegeben. Sollte aber jemand einen Satz mit URL eingeben, wofür das BBCode Feld eigentlich nicht gedacht ist,

Beispiel:

Tag url]Hallo, hier ein Link: http://www.example.com, schaut euch das mal an![Tag /url

dann wird der Satz mit der URL ausgegeben aber ohne die Tags. Die URL wird dann zwar nicht anklickbar sein, aber die Möglichkeit mit Copy und Paste bleibt bestehen.

Ich habe jetzt bewusst auf die vollständige Ausschreibung der Tags verzichtet, da hier im Forum alles was in den URL Tags steht markiert wird.

Beispiel:


Hallo, hier ein Link: http://www.example.com, schaut euch das mal an!

Die Moderatoren sollten die Betreiber dieses Forums auf das Manko aufmerksam machen aber vielleicht ist das auch so gewollt!!!

Vielleicht denke ich bei einer automatischen Suche und Umwandlung einfach zu weit reichend dass ich deswegen den Weg mit BBCode bevorzuge. Kann aber auch sein das ich einfach zu blöd bin um eine eigene Regex dafür zu schreiben. :uhm:

Viele Grüße,

Indium1
 

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Duddle,

auch Dir ein Dankeschön für den Tipp! :)


Das Beispiel von Zampano_ schlägt aber direkt zwei Fliegen mit einer Klappe und darauf kam es mir an.

Freundliche Grüße,

Indium1
 

Zampano_

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hi Indium1,
ehrlich gesagt würde ich mich nicht darum kümmern wenn jemand eine (falsche!) URL mit einem Leerzeichen einträgt. Wenn Leerzeichen, dann doch bitte urlencoded (also %20) - finde das kann man einem User mindestens genausogut erklären wie URLs per BBCode einzugeben.

Und wenn die Leerzeichen dann raus sind, hast du ja mit einem preg_match (oder preg_replace) geanu das Mittel der Wahl getroffen! ;)

Schöne Grüße
Zampano
 

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano,

da muss ich Dir Recht geben. Ein %20 Zeichen für Leerzeichen kann man dem User schon abverlangen. Wenn alle Stricke reißen sollten kann ich das ja noch eintragen. Tja, dann muss ich wohl noch mal ran an preg_match oder preg_replace und mir graut es jetzt schon davor!

Schöne Grüße

Indium1
 

Zampano_

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Dann wünsche ich dir viel Erfolg. Aber keine Angst, Regular Expressions können zwar manchmal recht nervig sein, können aber auch viel Spass machen...
(abgesehen davon wirst du einen Ausdruck für URLs auch im Netz finden)

Schöne Grüße
Zampano
 

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano,

Danke für die Erfolgswünsche aber ich glaube nicht dass ich das alleine Bewerkstelligen kann da mein Wissen dafür nicht ausreicht. :(

(abgesehen davon wirst du einen Ausdruck für URLs auch im Netz finden)
Ich beschäftige mich jetzt schon seit über drei Wochen damit und habe rauf und runter gegoogelt. Hierbei habe ich mehre Suchmuster eingegeben (Beispiele: PHP Auto Hyperlink Text URLs, Link im Text erkennen PHP, URL im Text erkennen PHP, URLs automatisch umwandeln PHP, Auto linking PHP, Auto link PHP, Link convert URLs PHP, …). Leider ist das was ich an vorgefertigten Scripten gefunden habe nicht sehr Erfolgversprechend gewesen. Klammern, Kommas und/oder + Zeichen wurden im Link nicht mitgenommen obwohl diese zur URL gehörten, Kommas, Punke oder andere Zeichen am ende einer URL wurden mitverlinkt obwohl diese nicht dazugehörten, ein einfaches im Satz stehendes Https:// ohne weitere Zeichenfolge wurde als Link deklariert und so weiter und so fort.

Der überwiegende Teil an gefundenen Scripten war regelrecht Deprecated (z. B. ereg_replace) obwohl die Einträge von 2010, 2011 sogar aus 2012 stammten. Warum solch veraltete Funktionen immer noch von Usern veröffentlicht werden, obwohl diese seit Jahren laut PHP Dokumentation nicht mehr empfohlen werden, entzieht sich meiner Kenntnis.


Für eine automatische Erkennung brauche ich demnach ein Codeschnippsel oder ein Script was weitestgehend alle Links im Text erkennt (http, https, ftp, ftps, sftp, gopher etc. und E-Mail). Zweites Problem ist die Zeichensprache da ja auch z. B. Chinesische Schriftzeichen in URLs erlaubt sind "Utf8".

Um ganz sicher zu gehen wäre eine Automatisierung in Verbindung mit manueller Eingabe durch BBCode. Somit könnte man im Zweifelsfall auf eine manuelle Eingabe ausweichen und die URL wird im href richtig ausgegeben. Hierbei darf die Automatisierung die Links in den BBCodes aber nicht überschreiben welch ein zusätzliches Problem darstellt. Man braucht also für die Automatisierung einen Aufruf, der aber die BBC Tags und alles was dazwischen steht in ruhe lässt.

Es wäre nett wenn Du mich bei diesem Vorhaben nochmals Unterstützen könntest.

Viel Grüße und schönes Wochenende,

Indium1
 

Zampano_

Nicht mehr ganz neu hier

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano,

vielen, vielen Dank für Deinen Tipp! :)

Bevor Du in den Urlaub fährst habe ich noch eine Frage. Ich muss die URLs zwischen den BB-Tags trimmen sodass Leerzeichen, Tabulatorzeichen und Umbrüche am Anfang und Ende eines Strings entfernt werden. Normalerweise kann man das ja in preg_replace mit \s\s+ erreichen aber leider hat das bei mehreren Tabulatorzeichen nicht mehr funktioniert. Von daher habe ich folgendes gemacht:

BB-Tags mit preg_replace_callback gesucht, gelöscht und den übrig gebliebenen String bzw. die URL zur function alle_bbcodes_trimmen gesendet:

PHP:
  $row[1] = preg_replace_callback("/\[link\](.*)\[\/link\]/isU", 'alle_bbcodes_trimmen', $row[1]);


In der function alle_bbcodes_trimmen wird die URL getrimmt, die BB-Tags wieder hinzugefügt und alles wird mit return wieder zurückgesendet:

PHP:
  function alle_bbcodes_trimmen($bbcodes)
  {
  $ergebnis = '[link]'.trim($bbcodes[1]).'[/link]';
  return $ergebnis;
  }

Hiermit wurde durchgesetzt, dass die URL wirklich am Anfang des Tags steht und genau am Endtag aufhört:

Beispiel Ausgabe:

PHP:
[link]http://www.example.org[/link]

Leider musste ich das Szenario so durchspielen da eine automatische Suche nach z. B. http:// auch URLs mitgenommen hat die in den BB-Tags standen, wenn diese Tabulatorzeichen am Anfang enthielten. Jetzt funktioniert es aber problemlos und die automatische Suche lässt BB-Tags in ruhe. URLs in BB-Tags werden erst später mit einem anderen Aufruf in links umgewandelt.


Was ich jetzt gerne von Dir wissen möchte ist, ob ich die function alle_bbcodes_trimmen so stehen lassen kann oder ob Dir da noch was auffällt was falsch sein könnte.

PS: Ausgegeben wird alles mit echo htmlspecialchars($row[1], ENT_QUOTES);

Viele Grüße und einen schönen Urlaub wünsche ich Dir :),

Indium1
 

Zampano_

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Indium,

die Funktion macht genau das du von ihr willst. Sie entfernt alle Tabs, Returns, Linefeeds und Leerzeuchen aus den Links.

PS: Ausgegeben wird alles mit echo htmlspecialchars($row[1], ENT_QUOTES);
Wofür möchtest du diese Ausgabe verwenden? Wenn es ein klickbarer Link sein soll, dann muxxt du urlencode() benutzen und nicht htmlspecialchars(). htmlspecialchars kannst du für eine Anzeige im Browser nehemn, aber nicht um gültige urls zu erzeugen, dafür sind andere Entitäten definiert.

Schöne Grüße und danke! :)
Zamp
 
Zuletzt bearbeitet:

Indium1

Nicht mehr ganz neu hier

AW: Strpos Suchposition von bis

Hallo Zampano,

vielen Dank für Deine Antwort!

Habe erst gedacht, dass ich in der function alle_bbcodes_trimmen einen Fehler gemacht habe im Bezug der Hochkommas oder bei den Punkten vor und nach der Variable. Daher wollte ich nochmals Deine Meinung darüber hören bzw. lesen.

...

htmlspecialchars kannst du für eine Anzeige im Browser nehemn
...
Das meinte ich auch damit!

Wünsche Dir morgen eine gute Fahrt und viel Spaß im Urlaub! :)

Grüße,

Indium1
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.066
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben