Per $_GET Variable mit Url auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Per $_GET Variable mit Url auslesen

    Hallo Leute,

    ich möchte eine übergebene Variable aus einer Url auslesen. Der Haken dabei: Bei der Variable handelt es sich um eine Url.
    Z.B.: http://www.meinedomain.mein/view.php?url=http://www.anderedomain.mein/test.php?action=1&print=0

    mit
    $url = $_GET['url'];
    lese ich die Variable aus, aber es geht nur bis action=1. Den Rest (&print=0) lässt er weg!

    wie kann ich das problem beheben?
    Gruß KMD
  • Re: Per $_GET Variable mit Url auslesen

    "KMD" schrieb:


    ich möchte eine übergebene Variable aus einer Url auslesen. Der Haken dabei: Bei der Variable handelt es sich um eine Url.
    Z.B.: http://www.meinedomain.mein/view.php?url=http://www.anderedomain.mein/test.php?action=1&print=0

    mit
    $url = $_GET['url'];
    lese ich die Variable aus, aber es geht nur bis action=1. Den Rest (&print=0) lässt er weg!


    Hallo,

    das liegt daran, das die URL nicht richtig codiert ist. In PHP gibt es dafür die Befehle urlencode/urldecode:

    Quellcode

    1. http://www.meinedomain.mein/view.php?url=<?=urlencode('http://www.anderedomain.mein/test.php?action=1&print=0')?>

    Mit

    Quellcode

    1. $strUrl = urldecode($_GET['url']);

    kannst Du die URL dann weiter verarbeiten.

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • "KMD" schrieb:

    Noch ne Frage: für was steht das = vor urlencode? Das ist mir bisher noch nie über den Weg gelaufen :)


    afaik bedeudet das = zeichen das dass ergebis des befehls an der stelle benutzt wird. sonst müsstest du ja n echo oder print machen... aber da es nicht ausgegeben werden soll, sondern nur "benutzt" nimmt man das =

    korrigiert mich falls ich da falsch liege ;)


    mfg da BendIt
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • "KMD" schrieb:

    Danke, ich werde es gleich mal ausprobieren!
    Noch ne Frage: für was steht das = vor urlencode? Das ist mir bisher noch nie über den Weg gelaufen :)


    "<?='test'?>" ist das gleiche wie "<?php echo('Test')?>".

    @BendIt: Das Ergbniss wird zwar "benutzt", aber zur Ausgabe! Wie gesagt, ist eigentlich nur eine Abkürzung...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Hmm... ich dachte das kann nicht so ein Problem sein das einzubinden. Da habe ich mich allerding geirrt. Der Link wird per preg_replace erzeugt und ich bekomme es einfach nicht gebacken! :?

    wenn ich es so mache

    Quellcode

    1. $texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http$3://$4$5")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);

    werden $3,$4 und $5 nicht ausgegeben. Und wenn ich es so mache

    Quellcode

    1. $texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http".$3."://".$4.$5."")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
    bekomme ich eine PHP-Fehlermeldung.

    Könnt Ihr mir bitte helfen? Ich bin noch nicht so fitt in php!
  • "KMD" schrieb:

    Hmm... ich dachte das kann nicht so ein Problem sein das einzubinden. Da habe ich mich allerding geirrt. Der Link wird per preg_replace erzeugt und ich bekomme es einfach nicht gebacken! :?

    wenn ich es so mache

    Quellcode

    1. $texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http$3://$4$5")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);

    werden $3,$4 und $5 nicht ausgegeben. Und wenn ich es so mache

    Quellcode

    1. $texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad.urlencode("http".$3."://".$4.$5."")."\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
    bekomme ich eine PHP-Fehlermeldung.

    Könnt Ihr mir bitte helfen? Ich bin noch nicht so fitt in php!


    Ein Schuss ins Blaue, aber probiers mal so:

    "<a href=\"".$viewpfad.urlencode("http{$3}://{$4}{$5}")."\" target=\"_blank\">{$2}{$4}{$5}</a>", $texteinleitung);

    könnte evtl. funktionieren...

    Oder mit preg_match den Link vorab zusammenbauen und dann ersetzten:

    easy-coding.de/ermitteln-eines…einem-textfeld-t3427.html

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Ich verzweifle gleich :cry:

    mit preg_match_all habe ich es immerhin hinbekommen das die Urls in eine TXT-Datenbank geschrieben werden (wie im anderen Beitrag schon besprochen). Aber wie ich replace dabei anwenden kann verstehe ich nicht. Des weiteren kommt dazu, dass in $texteinleitung mehrere Links vorkommen können, und das verwirrt mich noch mehr. Hier nochmal ein wenig mehr von meinem Code (Zusammengefasst).

    Quellcode

    1. $messagehtml .= "";
    2. // Links in die Statistik-TXT-Datenbank schreiben
    3. preg_match_all("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_PATTERN_ORDER);
    4. if(is_array($arrMatches))
    5. {
    6. foreach($arrMatches[0] as $url)
    7. {
    8. $datei = fopen($databases_dir."statistiken.txt", "a+");
    9. flock($datei,2);
    10. fputs($datei, "".$url.";;0;;\n");
    11. flock($datei,3);
    12. fclose($datei);
    13. }
    14. }
    15. // Erzeugung eines Links mit <a href...>-Tag
    16. $texteinleitung = preg_replace("/((http(s?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", "<a href=\"".$viewpfad."http$3://$4$5\" target=\"_blank\">$2$4$5</a>", $texteinleitung);
    17. // Erzeugung eines E-Mail-Links mit <a href="mailto:...>-Tag
    18. $texteinleitung = preg_replace("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", "<a href=\"mailto:$0\">$0</a>", $texteinleitung);
    19. $messagehtml .= $texteinleitung;
    20. echo $messagehtml;
    Alles anzeigen


    Ich stose mit der preg_match_all-Funktion leider an die Grenzen meines PHP-Lateins. Ich hoffe ihr könnt mir nochmal weiter helfen.

    Gruß KMD
  • hi

    mal ne frage: Wenn deine User die möglichkeit haben eine komplette URL in ein input feld zu schreiben und das dann mit dem formular abzuschicken, warum speicherst du den string dann nicht gleich in ner txt datei? also ohne irgendwelche preg/eregi funktionen? die regulären ausdrücke dienen bei dir doch eh nur der prüfung ob das eingegebene "Format" dem einer gültigen url entspricht? oder seh ich das falsch?

    ich versteh das problem leider nicht ganz :(

    btw: was soll in $texteinleitungen drin stehen bzw was kann da alles drin stehen???

    [edit]
    schau dir mal folgenden link an http://selfphp.de/funktionsreferenz/url_funktionen/parse_url.php

    evtl. hilft dir das weiter...
    .:Reden Ist Schweigen und Silber Ist Gold:.

    real programmers don't comment their code: if it was hard to write, it should be hard to read!
  • "KMD" schrieb:

    Ich verzweifle gleich :cry:

    mit preg_match_all habe ich es immerhin hinbekommen das die Urls in eine TXT-Datenbank geschrieben werden (wie im anderen Beitrag schon besprochen). Aber wie ich replace dabei anwenden kann verstehe ich nicht. Des weiteren kommt dazu, dass in $texteinleitung mehrere Links vorkommen können, und das verwirrt mich noch mehr.
    Gruß KMD


    Hallo,

    in $arrMatches stehen alle URLs drin, wenn Du "PREG_SET_ORDER" verwendest und nicht "PREG_PATTERN_ORDER"!

    Versuch's mal so in der Richtung:

    Quellcode

    1. $texteinleitung ='https://www.ctserver.org, http://ctbot.de, www.jquery.de';
    2. preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
    3. foreach($arrMatches as $arrMatch) {
    4. $strUrl = urlencode($arrMatch[0]);
    5. $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
    6. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatch[0] . '</a>', $texteinleitung);
    7. }


    Jetzt kannst die die URL encode wie Du's brauchst.
    Probleme machen allerdings jetzt noch Links ohne http(s), das müsste man noch abfangen...
    Je nach dem, welche Teil-Matches Du wirklich benötigst könntest Du die Klammerung in Deiner RegEx noch wesentlich vereinfachen...

    Wenn Du nicht klar kommst, dann füttere die Funktion einfach mit entsprechenden Strings und lass Dir $arrMatches ausgeben (echo('<pre>'); print_r($arrMatches); echo('</pre>'); )...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • "KMD" schrieb:

    @BendIt
    Hier ein Link zu einer Abgespeckten Version der Funktion. Vieleicht erklährt es sich leichter wenn Du siehst was dabei rauskommen soll.
    http://www.kmd-test.de/newsletter-datenbank-test/test/test2.php


    Sicherlich nicht die eleganteste Methode, und es fehlen auch noch ein paar "if"-Anweisungen, aber für mehr habe ich jetzt keine Zeit:

    Quellcode

    1. $viewpfad = 'http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=';
    2. $texteinleitung ='Hier steht der vom User eingegeben Einleitungs-Text... In diesem Text können mehrere Links eingebunden werden. Z.B:
    3. Link1: http://www.kmd-hosting.de/packages.php?pack=big&action=1
    4. Link2: http://www.kmd-web.de
    5. und Link 3: http://www.kmd-hosting.de/packages.php?pack=big&action=3 .
    6. Es können aber auch Email-Adressen eingebunden werden. Z.B. info@meine-domain.mein .
    7. Des Weiteren hat der User die Möglichkeit Mehrere Textblöcke, zB. für Produktbeschreibungen, zu erzeugen. Die Anzahl der Textblöcke ist nicht begrenzt und wird mit einem DOM-Konstrukt erzeugt. Anschliessend wird alles zusammen gefasst und in ein Newsletter-Template eingebunden. Beim Aufruf der Links soll zudem ein Counter die Klicks mit zählen.';
    8. preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
    9. foreach($arrMatches as $arrMatch) {
    10. $strUrl = urlencode($arrMatch[0]);
    11. $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
    12. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatch[0] . '</a>', $texteinleitung);
    13. }
    14. preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatches, PREG_SET_ORDER);
    15. foreach($arrMatches as $arrMatch) {
    16. $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatch[0]);
    17. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href=\"mailto:$0\">$0</a>' . $arrMatch[0] . '</a>', $texteinleitung);
    18. }
    Alles anzeigen


    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • OK. Danke! Funktioniert soweit bestens, bis auf ein kleines Problem.
    Wenn im String $texteinleitung 2x die gleiche Emailadresse oder Links vorkommen, erzeugt er eine falsche Ausgabe. Sind alle Adressen oder Links unterschiedlich geht es ohne Probleme.

    Hier nochmal mein geänderter Code

    Quellcode

    1. // Erzeugung von Links mit <a href...>-Tags
    2. preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatchesLinks, PREG_SET_ORDER);
    3. if(is_array($arrMatchesLinks))
    4. {
    5. foreach($arrMatchesLinks as $arrMatchLink)
    6. {
    7. $strEnd = substr($arrMatchesLinks[0], -1);
    8. if(!ereg("^[A-Za-z0-9]+$", $strEnd))
    9. {
    10. $arrMatchesLinks[0] = substr($arrMatchesLinks[0], 0, -1);
    11. }
    12. // URL Codieren (Wird in der view.php wieder Decodiert)
    13. $strUrl = urlencode($arrMatchLink[0]);
    14. $strSearch = str_replace(array('.', '/', '?'), array('\.', '\/', '\?'), $arrMatchLink[0]);
    15. // Erzeugung von Links mit <a href...>-Tags
    16. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung);
    17. }
    18. }
    19. // Erzeugung von E-Mail-Links mit <a href="mailto:...>-Tags
    20. preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatchesEmails, PREG_SET_ORDER);
    21. if(is_array($arrMatchesEmails))
    22. {
    23. foreach($arrMatchesEmails as $arrMatchEmail)
    24. {
    25. $strEnd = substr($arrMatchEmail[0], -1);
    26. if(!ereg("^[A-Za-z0-9]+$", $strEnd))
    27. {
    28. $arrMatchEmail[0] = substr($arrMatchEmail[0], 0, -1);
    29. }
    30. $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatchEmail[0]);
    31. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="mailto:' . $arrMatchEmail[0] . '">' . $arrMatchEmail[0] . '</a>', $texteinleitung);
    32. }
    33. }
    Alles anzeigen


    Was läuft falsch? Bzw. wie kann ich das Problem abfangen?

    Gruß KMD
  • Häng mal an beide preg_replace als weiteren Parameter eine eins:


    Quellcode

    1. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung, 1);


    Dadurch wird immer nur das erste Vorkommen ersetzt...

    70abc
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Hi 70abc,

    die "1" bringt leider nicht das gewünschte Ergebnis, denn bei mehrmaligem vorkommen eines Links wird nur der erste Link mit einem <A>-Tag maskiert.

    Da es sich bei der Eingabe des Users um eine längere Produktbeschreibung handeln könnte, sollten durchaus die Eingabe mehrer gleiche Link erlaubt sein, welche dann auch mit dem <a>-Tag maskiert werden.
  • Hallo,

    dann musst Du eben dafür sorgen, das jeder Link nur einmal bearbeitet wird:

    Quellcode

    1. preg_match_all("/(((https?):\/\/)|(www\.))([\w\_\-\/\.\?\=\&\~]+)/i", $texteinleitung, $arrMatchesLinks, PREG_SET_ORDER);
    2. if(is_array($arrMatchesLinks))
    3. {
    4. foreach($arrMatchesLinks as $arrMatchLink)
    5. {
    6. $arrSearched = array();
    7. $strEnd = substr($arrMatchesLinks[0], -1);
    8. if(!ereg("^[A-Za-z0-9]+$", $strEnd))
    9. {
    10. $arrMatchesLinks[0] = substr($arrMatchesLinks[0], 0, -1);
    11. }
    12. // URL Codieren (Wird in der view.php wieder Decodiert)
    13. $strUrl = urlencode($arrMatchLink[0]);
    14. $strSearch = str_replace(array('.', '/', '?'), array('\.', '\/', '\?'), $arrMatchLink[0]);
    15. // Erzeugung von Links mit <a href...>-Tags
    16. if(!in_array($strUrl, $arrSearched)) {
    17. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="' . $viewpfad . $strUrl . '" target="_blank">' . $arrMatchLink[0] . '</a>', $texteinleitung);
    18. $arrSearched[] = $strUrl;
    19. }
    20. }
    21. }
    22. // Erzeugung von E-Mail-Links mit <a href="mailto:...>-Tags
    23. preg_match_all("/([\w\_\-\.]+)(@)([\w\_\-\.]+)/i", $texteinleitung, $arrMatchesEmails, PREG_SET_ORDER);
    24. if(is_array($arrMatchesEmails))
    25. {
    26. foreach($arrMatchesEmails as $arrMatchEmail)
    27. {
    28. $arrSearched = array();
    29. $strEnd = substr($arrMatchEmail[0], -1);
    30. if(!ereg("^[A-Za-z0-9]+$", $strEnd))
    31. {
    32. $arrMatchEmail[0] = substr($arrMatchEmail[0], 0, -1);
    33. }
    34. $strSearch = str_replace(array('.', '/'), array('\.', '\/'), $arrMatchEmail[0]);
    35. if(!in_array($arrMatchEmail[0], $arrSearched)) {
    36. $texteinleitung = preg_replace('/' . $strSearch . '/i', '<a href="mailto:' . $arrMatchEmail[0] . '">' . $arrMatchEmail[0] . '</a>', $texteinleitung);
    37. $arrSearched[] = $arrMatchEmail[0];
    38. }
    39. }
    40. }
    Alles anzeigen


    70abc

    PS: Sorry für die komische Formatierung, liegt aber irgendwie an der Forensoftware...
    We raise hopes, here ... until they're old enough to fend for themselves.
    - Mike Callahan
  • Hi 70abc,

    Erstmal Danke für deine Mühe!
    Ich traue es mich garnicht zu sagen aber es gibt da noch ein weiteres Problem.
    Wenn der String folgendermasen aufgebaut ist:

    Quellcode

    1. $texteinleitung="http://www.meinetestdomain.de , hier nochmal der Link mit html http://www.meinetestdomain.de/meinedatei.html

    dann spuckt er folgendes aus:

    Quellcode

    1. <a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>
    2. , hier nochmal der Link mit html
    3. <a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>/meinedatei.html

    anstatt

    Quellcode

    1. <a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de</a>
    2. , hier nochmal der Link mit html
    3. <a href="http://www.kmd-test.de/newsletter-datenbank-test/test/newsletter_view.php?url=http%3A%2F%2Fwww.meinetestdomain.de" target="_blank">http://www.meinetestdomain.de/meinedatei.html</a>

    das heist, das er beim zweiten Link den Teil "/meinedatei.html" ignoriert.

    Ich habe schon so einiges ausprobiert, aber leider ohne Erfolg.
    Das komische ist auch, dass bei einer "echo" Ausgabe der Variablen $arrMatchLink[0] und $strSearch die URLs richtig ausgegeben werden sie werden aber anschließend nicht richtig ersetzt.

    Kannst du mir nochmal helfen? Sorry für mein nervtötendes Problem :oops:

    Gruß KMD