der hans: scho wieda der :-(..ä..bestimmten teil eines strings verändern

hallo,

ich nerv weiter...

folgendes:

$string="da steht was -DAS WAS GEÄNDERT WERDEN SOLL- da steht was";

Nun möchte ich auf DAS WAS GEÄNDERT WERDEN SOLL (immer zwischen - -) urlencode anwenden???

Wie???

grüße aus franken

  1. echo $begrüßung;

    $string="da steht was -DAS WAS GEÄNDERT WERDEN SOLL- da steht was";
    Nun möchte ich auf DAS WAS GEÄNDERT WERDEN SOLL (immer zwischen - -) urlencode anwenden???

    Allgemein: PHP-Handbuch (<- sehr nützlich, wenn man PHP programmieren möchte. Man sollte wenigstens wissen, was wo steht.) Kapitel String Functions.
    Handelt es sich um ein regelmäßiges Muster, und das Anwenden einfacher Stringfunktionen wird zu komplex, kann man auch mit Regulären Ausdrücken arbeiten. Dabei sind die Regular Expression Functions (Perl-Compatible) zu bevorzugen.

    Vermutlich möchtest du was anderes. Mitten in einem Fließtext URL-Kodierung anzuwenden halte ich nicht für sehr sinnvoll. Vielleicht solltest du ein konkreteres Beispiel angeben, damit man auch mal die Chance hat, einen sinnvollen Alternativvorschlag zu geben.

    P.S: Du verwendest immer noch zu viele Satzzeichen.

    echo "$verabschiedung $name";

    1. hi,

      also hab ne individuelle eingabe die in einer datenbank gespeichert ist.

      Diese kann so etwas wie bbcode enthalten z.B. einen für Links.
      meine bisherige umwandlung sieht so aus:
        $message=preg_replace("/(?::url:)(.+?)(?::/url/:)(.+?)(?::/url:)/","<a href="http://$1">$2</a>",$message);

      so nun kann ja der teil bei href="" auch zeichen wie ?&= und leerzeichen enthalten, die nicht konform sind.

      diese würde ich gerne mit urlencode entfernen.

      danke

      grüchen aus franken

      1. hi,

        Diese kann so etwas wie bbcode enthalten z.B. einen für Links.
        meine bisherige umwandlung sieht so aus:
          $message=preg_replace("/(?::url:)(.+?)(?::/url/:)(.+?)(?::/url:)/","<a href="http://$1">$2</a>",$message);

        so nun kann ja der teil bei href="" auch zeichen wie ?&= und leerzeichen enthalten, die nicht konform sind.

        diese würde ich gerne mit urlencode entfernen.

        Du möchtest sie nicht entfernen, sondern kodieren - sonst wäre ja der Link nicht mehr gültig, wenn du nach eigenem Gusto Zeichen entfernst.

        Und das, was du behandeln möchtest, befindet sich ja in $1 - also wäre es vielleicht am einfachsten, wenn du dafür preg_replace_callback verwendest, mit einer eigendefinierten Callback-Funktion, in der dann u.a. (raw)urlencode auf $1 angewandt wird.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. echo $begrüßung;

        so nun kann ja der teil bei href="" auch zeichen wie ?&= und leerzeichen enthalten, die nicht konform sind.
        diese würde ich gerne mit urlencode entfernen.

        Es ist keine gute Idee (<- gelinde ausgedrückt), den kompletten Wert des href-Attributes, also die gesamte URL, zu urlencodieren. Wenn du das dennoch tust, wird

        http://example.com/pfad/ressource?param1=wert&param2=wert#anker

        zu

        http%3A%2F%2Fexample.com%2Fpfad%2Fressource%3Fparam1%3Dwert%26param2%3Dwert%23anker

        und das ist dann keine gültige URL mehr.

        Die URL soll im HTML-Kontext ausgegeben werden, also ist diese in erster Linie HTML-gerecht zu notieren (htmlspecialchars() reicht dafür). Innerhalb der URL sind vorher jedoch einige und nur einige, nicht alle Teile mit urlencode() zu behandeln. Die zu berücksichtigenden Teile sind die, welche Daten über die URL transportieren sollen, also nur die Werte der Parameter im Query-Teil.

        Es ist also erforderlich, die URL in ihre Einzelteile zu zerlegen (parse_url()), dann den Query-String in Schlüssel und Werte aufzuteilen (parse_str()) und nun die einzelnen Werte mit urlencode() zu behandeln. Anschließend muss man das ganze wieder zu einer URL zusammenbauen und nach einer HTML-gerechten Kodierung kann man es dem href-Attribut übergeben.

        echo "$verabschiedung $name";

        1. hi dedlfix,

          ich ging darauf zwar dummerweise gar nicht ein - möchte dich jetzt aber doch noch mal korrigieren:

          Innerhalb der URL sind vorher jedoch einige und nur einige, nicht alle Teile mit urlencode() zu behandeln. Die zu berücksichtigenden Teile sind die, welche Daten über die URL transportieren sollen, also nur die Werte der Parameter im Query-Teil.

          Nein, auch "Verzeichnis-" und "Dateinamen" können Sonderzeichen enthalten, die in einem korrekten URL kodiert werden müssten - denke nur an das beliebte Leerzeichen in Verzeichnisnamen wie "/meine Urlaubsbilder 2006/".

          Hierbei muss natürlich darauf geachtet werden, dass nur die Namen, und nicht etwa auch der Verzeichnistrenner / kodiert werden - sonst käme wieder Unsinniges heraus.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. echo $begrüßung;

            Nein, auch "Verzeichnis-" und "Dateinamen" können Sonderzeichen enthalten, die in einem korrekten URL kodiert werden müssten - denke nur an das beliebte Leerzeichen in Verzeichnisnamen wie "/meine Urlaubsbilder 2006/".

            Ja, im HTTP-Kontext muss man das tun, aber das ist Aufgabe des Browsers, der dann diese URL vom HTML-Kontext in den HTTP-Kontext bringt. Man kann das schon vorab machen, ist aber nicht nötig.

            echo "$verabschiedung $name";

            1. hi,

              Ja, im HTTP-Kontext muss man das tun, aber das ist Aufgabe des Browsers, der dann diese URL vom HTML-Kontext in den HTTP-Kontext bringt.

              Das sehe ich nicht so.
              Da könntest du auch sagen, im Query-String wäre es ebenfalls Aufgabe des Browsers - im HTML-Kontext ist urlencode nicht erforderlich, da reicht htmlspecialchars.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. echo $begrüßung;

                Ja, im HTTP-Kontext muss man das tun, aber das ist Aufgabe des Browsers, der dann diese URL vom HTML-Kontext in den HTTP-Kontext bringt.

                Da könntest du auch sagen, im Query-String wäre es ebenfalls Aufgabe des Browsers - im HTML-Kontext ist urlencode nicht erforderlich, da reicht htmlspecialchars.

                Die Aussage nach dem - stimmt soweit, nur übersiehst du dabei, dass wir uns an der Stelle noch nicht im HTML-Kontext sondern erst im URL-Kontext befinden. Im URL-Kontext haben Zeichen wie ?, #, / eine besondere Bedeutung, welche es gilt zu entschärfen, damit sie nicht als Sonderzeichen interpretiert werden, und das erreicht man mit htmlspecialchars() (&,",<,>) nicht.

                urlencode() schießt hier sicherlich übers Ziel hinaus, weil es auch gleich noch alle Zeichen oberhalb von 127 kodiert. Das könnte in der Tat auch der Browser noch machen, wenn es für den Transport-Kontext erforderlich ist.

                Ein Beispiel wie es gamacht werden soll, zeigt übrigens die Handbuchseite zu urlencode() (mal abgesehen davon, dass dort htmlentities() genommen wird wo ein htmlspecialchars() ausreicht).

                echo "$verabschiedung $name";

      3. Hi,

        supi!

        Danke mal für eure Antworten-> dann geh ich jetzt mal testen

        grüßchen aus franken

        1. Hi,

          danke nochmal.

          Hier das Ergebnis:

          ----------
          $test=":url:http://www.einfach schwachsinn.dö?so'n mist:/url/: so wät:/url:";

          function encode($muster)
          {
          $url=urlencode($muster[1]);
          $url=str_replace("http%3A%2F%2F","",$url);
          return "<a href="http://".$url."" target="_blank">".$muster[2]."</a>";
          }

          $test=preg_replace_callback("/(?::url:)(.+?)(?::/url/:)(.+?)(?::/url:)/","encode",$test);

          echo $test;
          ----------

          Dies ist dann die Ausgabe:

          <a href="http://www.einfach+schwachsinn.d%F6%3Fso%27n+mist" target="_blank"> so wät</a>

          Müstte klappen wa?

          gruß aus franken

          1. echo $begrüßung;

            Dies ist dann die Ausgabe:
            <a href="http://www.einfach+schwachsinn.d%F6%3Fso%27n+mist" target="_blank"> so wät</a>
            Müstte klappen wa?

            Nö. Mal abgesehen vom Umlaut im Domainnamen, der nochmal ganz anders kodiert werden müsste (Puny-Code), darf da kein %3F stehen sondern muss ein ? sein, sonst wird es nicht als Trennzeichen für den Query-Part erkannt. Du darfst nicht die URL url-kodieren, weil die sonst wie Daten aussieht. Nur die Daten selbst, die du über die URL transportierst müssen url-kodiert werden, damit sie keine Zeichen mehr enthalten, die in einer URL besondere Bedeutung haben.

            echo "$verabschiedung $name";

            1. Hi,

              also wenn ich die url zerlege, und dann den query mit urlencode bearbeite kommt dasselbe raus!!

              Wie soll ich de genua machen, wenn ich die url zerlegt hab?

              ---
              $test=":url:http://www.einfach schwachsinn.dö?so'n mist&ein änker#soso:/url/: so wät:/url:";
              function encode($muster)
              {
              $url=$muster[1];
              $urlhost=parse_url($url,PHP_URL_HOST);
              $urluser=parse_url($url,PHP_URL_USER);
              $urlpass=parse_url($url,PHP_URL_PASS);
              $urlpath=parse_url($url,PHP_URL_PATH);
              $urlquery=parse_url($url,PHP_URL_QUERY);
              $urlfragment=parse_url($url,PHP_URL_FRAGMENT);
              $urlport=parse_url($url,PHP_URL_PORT);

              $url=$urlhost.$urluser.$urlpass.$urlpath.$urlquery.$urlfragment.$urlport;

              return "<a href="http://".$url."" target="_blank">".$muster[2]."</a>";
              }
              $test=preg_replace_callback("/(?::url:)(.+?)(?::/url/:)(.+?)(?::/url:)/","encode",$test);
              echo $test;
              ---

              gruß