Andreas Vogt: Häufigkeit des Vorkommens eines Zeichen in Zeichenkette

Hallo,
möchte eine Zeichenkette auf \r\n prüfen, wie oft das vorkommt.
Habe es mit split() versucht: $helpvar = split("\r\n", $body);
Aber count($helpvar) hat immer 1 ausgegeben, egal wieviele Umbrüche vorhanden waren. Was mach ich falsch?

Gruß Andreas

  1. Hallo,

    möchte eine Zeichenkette auf \r\n prüfen, wie oft das vorkommt.
    Habe es mit split() versucht: $helpvar = split("\r\n", $body);
    Aber count($helpvar) hat immer 1 ausgegeben, egal wieviele Umbrüche vorhanden waren. Was mach ich falsch?

    Vielleicht ist Dein Umbruch nicht \r\n? Zeilenumbrüche sind leider platformabhängig - und teilweise haben einige Programmiersprachen (auch PHP an verschiedenen Stellen) automatische Konvertierungen eingebaut (wenn Du Dateien bspw. nicht als "wb" oder "rb" sondern nur als "r" oder "w" öffnest).

    Am besten Du wandelst zuerst alle Zeilenumbrüche (\r\n für DOS/Windows, \r für Mac bis Mac OS 9, \n für UNIX und Mac ab Mac OS X) in ein einheitliches Format um:

    // alles durch \n ersetzen  
    $text = preg_replace ("/\r\n|\r|\n/", "\n", $text);
    

    Zählen kannst Du dann entweder über Deine split-Lösung - oder eben über substr_count:

    $umbruch_zahl = substr_count ($text, "\n");

    Viele Grüße,
    Christian

  2. Hi,

    möchte eine Zeichenkette auf \r\n prüfen, wie oft das vorkommt.
    Habe es mit split() versucht: $helpvar = split("\r\n", $body);
    Aber count($helpvar) hat immer 1 ausgegeben, egal wieviele Umbrüche vorhanden waren. Was mach ich falsch?

    Du nimmst vermutlich an, der Zeilemumbruch waere \r\n, aber erst ist es nicht.
    http://de.wikipedia.org/wiki/Zeilenumbruch

    Und wenn du erst mal weist, was du wirklich suchst - dann waere substr_count in denn allermeisten Faellen wohl effektiver als splitten mit regulaerem Ausdruck.

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
  3. Hallo Andreas,

    möchte eine Zeichenkette auf \r\n prüfen, wie oft das vorkommt.
    Was mach ich falsch?

    Du hast nicht im Handbuch nachgeschaut: substr_count()

    Freundliche Grüße

    Vinzenz

  4. Hallo,
    Danke euch für die Antworten, wusste nicht dass \r\n nur auf Windows systemen funktionieren, (es sind doch die Client-Rechner gemeint?

    Habe jetzt auf der Schnelle mal improvisiert, werde das aber noch in trockene Tücher bringen.
    $i = 0;
    $offset=0;
    While (strpos($text,"\r\n", $offset)>0){
        $i = $i + 1;
        $offset = strpos($text, "\r\n", $offset)+1;
    }

    if ($i > 1){
        $helpvar = split("\r\n", $text);
        $text = $helpvar[0] . "<br />" . $helpvar[1];
    }

    Gruß Andreas

    1. Hi,

      Danke euch für die Antworten, wusste nicht dass \r\n nur auf Windows systemen funktionieren, (es sind doch die Client-Rechner gemeint?

      Das kommt drauf an.

      Wenn du Daten ueber's WWW, bspw. ein HTML-Formular uebermittelst - dann erstellt natuerlich zunaechst mal das System, auf dem der Browser laeuft, die Zeilenumbrueche.

      Habe jetzt auf der Schnelle mal improvisiert, werde das aber noch in trockene Tücher bringen.

      Sieht das nur so aus, oder versuchst du gerade nl2br() nachzubasteln, weil du das auch noch nicht kennst?

      Ja, nl2br ersetzt die Zeilenumbruchzeichen nicht, sondern fuegt nur <br /> hinzu; aber das reicht i.d.R. ja aus. Aber selbst wenn dir das nicht reichen wuerde, weiss ich nicht, wofuer du erst mal die Umbrueche zaehlen, und dann anschliessend ersetzen willst - das ist mit einem preg_replace auch fixer gemacht.

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
    2. Hallo,

      Danke euch für die Antworten, wusste nicht dass \r\n nur auf Windows systemen funktionieren, (es sind doch die Client-Rechner gemeint?

      Im allgemeinen kann man alles mögliche als Zeilenumbruch bekommen (weil da Browser oder irgendwelche Zwischenschichten oder weiß der Teufel was noch damit rumfummelt), ich empfehle daher wie gesagt den kompletten Text per Regexp (siehe mein anderes Posting) in ein eiheitliches Format zu konvertieren und dann damit weiterzuarbeiten.

      Habe jetzt auf der Schnelle mal improvisiert, werde das aber noch in trockene Tücher bringen.
      $i = 0;
      $offset=0;
      While (strpos($text,"\r\n", $offset)>0){
          $i = $i + 1;
          $offset = strpos($text, "\r\n", $offset)+1;
      }

      if ($i > 1){
          $helpvar = split("\r\n", $text);
          $text = $helpvar[0] . "<br />" . $helpvar[1];
      }

      Bitte *was* machst Du da? Erst ein nachprogrammiertes "poor man's substr_count()" (das nichtmal 100%ig korrekt ist, übrigens) und dann gibst Du die ersten beiden Zeilen mit <br> getrennt aus? Das geht doch *viel* einfacher:

      // alles durch \n ersetzen  
      $text = preg_replace ("/\r\n|\r|\n/", "\n", $text);  
      if (substr_count ($text, "\n") > 1) {  
        $lines = explode ("\n", $text, 3);  
        echo $lines[0]."<br />\n".$lines[1];  
      }
      

      Oder, wenn Du einfach *alle* Zeilenumbrüche durch <br /> ersetzen willst, gibt's doch nl2br(), da brauchst Du doch nichts selbst implementieren...

      echo nl2br ($text);

      Mir ist wirklich nicht ganz klar, was für ein Problem Du mit dem obigen Code lösen willst...

      Viele Grüße,
      Christian

      1. Hallo,

        Bitte *was* machst Du da? [...]

        Stelle gerade fest: Das kam aggressiver 'rüber als beabsichtigt. Ich sollte um die Uhrzeit wohl keine Postings mehr schreiben... Sorry.

        Viele Grüße,
        Christian

        1. Hallo,
          kein Problem, der Code war ja auch grottenschlecht.
          Bin wie man sieht kein PHP Coder sondern verdiene meine Brötchen mit Visual Basic/Access/SQL Server

          In der Tat kannte ich substr_count() nicht.
          Hatte es aber gestern Abend gleich noch umgebaut wie du empfohlen hast.

          Was ich möchte:
          Einen String an einem Leerzeichen kürzen, pfrüfen ob mehr als 1 Umbruch vorhanden, wenn ja String nochmals kürzen und erste beiden Zeilen verwenden.

          Aber das klappt ja jetzt dank eurer Hilfe.

          Gruß Andreas