Ben: Durchnummerierung einzelner Textpassagen

Hallo zusammen!

In einem Text möchte ich beim Vorkommen bestimmter Zeichen eine PHP-Funktion ausführen, so z.B. hinter jeden Link eines Artikels eine fortlaufende Nummer schreiben und diese dann am Seitenende zusammen mit dem Link noch einmal aufführen.

Derzeit gehe ich davon aus, dass preg_match_all() der richtige Ansatz für mein Vorhaben ist. Allerdings half selbst ein Studium von php.net meinem Verständnis leider nicht weiter, weshalb ich hoffe hier richtig zu sein.

Besten Dank im Voraus,
Ben

  1. Servus,

    Derzeit gehe ich davon aus, dass preg_match_all() der richtige Ansatz für mein Vorhaben ist.

    Damit ist es auf jeden Fall möglich. Was hast du bisher versucht?

    Gruss
    Patrick

    --
    sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:) va:} de:> zu:) fl:| ss:| ls:[ js:|
  2. gudn tach!

    In einem Text möchte ich beim Vorkommen bestimmter Zeichen eine PHP-Funktion ausführen, so z.B. hinter jeden Link eines Artikels eine fortlaufende Nummer schreiben und diese dann am Seitenende zusammen mit dem Link noch einmal aufführen.

      
    $i = 0;  
    $s = preg_replace('/(<a href=")([^"]+)("[^>]*>)(.*?)(<\/a>)/es',"'$1'.(\$link_arr[\$i][0]='$2').'$3'.(\$link_arr[\$i][1]='$4').'$5['.++\$i.']'", $s);
    

    gewinnt vermutlich keinen schoenheitswettbewerb, sollte aber funzen.
    schau dir fuers verstaendnis mal die modifier an, insb. 'e', sowie die user-comments (auch bei preg_replace() und preg_replace_callback()), die davon handeln.

    ferner wird benutzt, dass
      echo $foo=123;
    hier das gleiche tut wie
      $foo=123; echo $foo;.

    mit print_r($link_arr); kannst du am schluss dir mal anschauen, wie $link_arr aufgebaut ist und dann entsprechend eine ausgabe schreiben, die das gewuenschte "literaturverzeichnis" erstellt.

    Derzeit gehe ich davon aus, dass preg_match_all() der richtige Ansatz für mein Vorhaben ist. Allerdings half selbst ein Studium von php.net meinem Verständnis leider nicht weiter, weshalb ich hoffe hier richtig zu sein.

    ja, mit preg_match_all() waers auch gegangen.
    1. erst alle links suchen, in einem array samt positionen (flags entsprechend setzen) speichern,
    2. anschliessend mit gewoehnlichen textbearbeitungstools (str_replace, substr, ...) noch mal ueber den string drueberjagen und an den entsprechenden stellen die zahlen einfuegen.
    3. schliesslich noch das array anfuegen.

    prost
    seth

    1. gudn tach!

      $i = 0;
      $s = preg_replace('/(<a href=")([^"]+)("[^>]>)(.?)(</a>)/es',"'$1'.($link_arr[$i][0]='$2').'$3'.($link_arr[$i][1]='$4').'$5['.++$i.']'", $s);

      
      >   
      > gewinnt vermutlich keinen schoenheitswettbewerb, sollte aber funzen.  
      > schau dir fuers verstaendnis mal die [modifier](http://php.net/manual/en/reference.pcre.pattern.modifiers.php) an, insb. 'e', sowie die user-comments (auch bei [preg_replace()](http://php.net/preg_replace) und [preg_replace_callback()](http://php.net/preg_replace_callback)), die davon handeln.  
        
      Hallo Seth,  
        
      erst einmal vielen Dank für die Hilfe. Den Code habe ich nun meinen Ansprüchen entsprechend etwas abgewandelt, sodass ich jetzt auch zum gewünschten [Ergebnis](http://www.booni.de/newsdrucken/313/) gekommen bin:  
        
      ~~~php
        
      $i = 0;  
      $s = preg_replace('/(<a href=")([^"]+)("[^>]*>)(.*?)(<\/a>)/es',"'<!--'.(\$link_arr[\$i]='$2').'//--><span style=\"font-weight:bold\">$4 ['.++\$i.']</span>'",$s);  
      
      

      Allerdings stören mich derzeit noch zwei Feinheiten, die ich demnächst beheben möchte:

      Erstens sollte das Auskommentieren des "$link_arr=..." im Text nur eine temporäre Lösung bleiben (eine Variablenzuweisung ohne Ausgabe habe ich derzeit noch nicht hinbekommen). Und zweitens zeigt der erste User-Comment unter preg_replace_callback()) doch sehr deutliche Geschwindingkeitsunterschiede, weshalb ich auf lange Sicht lieber diese Funktion nutzen möchte.

      Primär habe ich mein Ziel jedenfalls erstmal erreicht und bedanke mich dafür,
      Ben

      1. gudn tach!

        Den Code habe ich nun meinen Ansprüchen entsprechend etwas abgewandelt, sodass ich jetzt auch zum gewünschten Ergebnis gekommen bin:

        ok, was mich aber noch wundert: warum loeschst du die verlinkungen? soll der kram eh nur ausgedruckt werden? oder soll dadurch der inhalt frei von externen links sein? in der wikipedia finde ich eine solche vorgehensweise zwar sinnvoll, aber in normalen html-dokumenten verstehe ich erstmal nicht den sinn, externe links zu unterbinden.

        ausserdem wuerde ich nur etwas mit "links" bezeichnen, was auch wirklich verlinkt. aber bei den "links" fuehrst du genau genommen nur urls auf und beim "url" zur meldung hast du dann wiederum den url sogar verlinkt.

        Allerdings stören mich derzeit noch zwei Feinheiten, die ich demnächst beheben möchte:

        Erstens sollte das Auskommentieren des "$link_arr=..." im Text nur eine temporäre Lösung bleiben (eine Variablenzuweisung ohne Ausgabe habe ich derzeit noch nicht hinbekommen).

        das koenntest du durch die verwendung von preg_replace_callback() umgehen. $link_arr muesste dafuer aber afais eine globale variable sein.

        Und zweitens zeigt der erste User-Comment unter preg_replace_callback()) doch sehr deutliche Geschwindingkeitsunterschiede, weshalb ich auf lange Sicht lieber diese Funktion nutzen möchte.

        ja, in der regel wird wohl die callback-funktion besser sein, weil dort kein string "evaluiert" werden muss.
        du wirst also beide probleme mit preg_replace_callback() loesen koennen.

        wenn du fertig bist, kannst du ja den code dafuer mal hier posten; 1. fuers archiv und 2. damit er evtl. noch verbessert werden kann.

        prost
        seth

        1. gudn tach!

          ok, was mich aber noch wundert: warum loeschst du die verlinkungen? soll der kram eh nur ausgedruckt werden? [blabla...]

          ja! http://www.booni.de/newsdrucken/313/
                                      ^^^^^^^ ;-)

          trotzdem noch eine anmerkung:
          ich wuerde die zahlen hochstellen (<sup>[1]</sup> oder sogar <sup>1</sup>) und _ohne_ leerzeichen vom begriff trennen. ist normalerweise so ueblich.

          prost
          seth

        2. Hallo!

          ok, was mich aber noch wundert: warum loeschst du die verlinkungen? soll der kram eh nur ausgedruckt werden?

          Wie Du in Deinem anderen Beitrag richtig erkannt hast, dient die verlinkte Seite nur dem Ausdruck. Die richtige News findest Du, wenn Du das 'drucken' aus dem URL entfernst oder auf das Logo oben links klickst. Das Leerzeichen habe ich inzwischen auch entfernt, ein Hochstellen der Zahlen sah jedoch sehr gewöhnungsbedürftig aus und wurde daher wieder herausgenommen.

          ausserdem wuerde ich nur etwas mit "links" bezeichnen, was auch wirklich verlinkt. aber bei den "links" fuehrst du genau genommen nur urls auf und beim "url" zur meldung hast du dann wiederum den url sogar verlinkt.

          Das dient nur dem Verständnis, da der richtige Beitrag wie gewohnt verlinkt. Wie man sicherlich sieht, habe ich mich stark an der Druckversion von heise orientiert.

          Vielen Dank für die weiteren Hinweise. Den überarbeiteten Code mit preg_replace_callback() werde ich jedoch wohl erst morgen oder den Tag darauf posten können...

          Beste Grüße,
          Ben

          1. gudn tach!

            Das Leerzeichen habe ich inzwischen auch entfernt, ein Hochstellen der Zahlen sah jedoch sehr gewöhnungsbedürftig aus und wurde daher wieder herausgenommen.

            sieht halt so aus wie z.b. in der wikipedia (beispiel)

            Wie man sicherlich sieht, habe ich mich stark an der Druckversion von heise orientiert.

            ah, ok, jetzt wo du's sagst...

            prost
            seth