Thorsten: Gradzeichen mit preg_replace ersetzen?

Hallo,
ich würde gerne eine Gradzahl auslesen, die dann aber ohne das Gradzeichen dargestellt werden soll.
Dazu habe ich folgenden Quelltext verwendet:

Das ist mein Array [0] => Temperature: 86°F / 30°C

preg_match("/Temperature: (.*?)F / (.*?);C/si", $arr[0], $str);
$wetter['temp'] = $str['2'];

Wenn ich es so schreibe, dann funktioniert es und ich bekomme 30° heraus.
Allerdings brauche ich das ganze nur als "30", also ohne das ° Symbol.
Ich habe mich schon seit Tagen verzweifelt umgeschaut aber nichts gefunden das mich wirklich weiterbringt.

Mit freundlichen Grüßen
Thorsten

  1. echo $begrüßung;

    ich würde gerne eine Gradzahl auslesen, die dann aber ohne das Gradzeichen dargestellt werden soll.
    preg_match("/Temperature: (.*?)F / (.*?);C/si", $arr[0], $str);

    Wenn du nur die Gradzahl haben möchtest solltest du nicht nach beliebigen Zeichen (.) suchen sondern nur nach Ziffern. Für Ziffern gibt es (Achtung! Stichwort) eine Zeichenklasse.

    echo "$verabschiedung $name";

    1. Wenn du nur die Gradzahl haben möchtest solltest du nicht nach beliebigen Zeichen (.) suchen sondern nur nach Ziffern. Für Ziffern gibt es (Achtung! Stichwort) eine Zeichenklasse.

      Habe die Zeichenklassen sogar gefunden bei SelfHTML, allerdings gibt er mir die Fehlermeldung "Warning: Unknown modifier '[' in"... aus wenn ich es mit [0-9] versuche.
      Probiere ich es mit /\d/ bekomme ich die selbe Fehlermeldung mit " '' ". Was mache ich falsch?

    2. Hallo dedlfix.

      Wo ich dich gerade hier antreffe: könntest du mir vielleicht bei einem Problem helfen? Ich habe es hier beschrieben.

      Und ich stolpere immer wieder darüber …

      Einen schönen Mittwoch noch.

      Gruß, Ashura

      --
      sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
      „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
      [HTML Design Constraints: Logical Markup]
      1. echo $begrüßung;

        Wo ich dich gerade hier antreffe: könntest du mir vielleicht bei einem Problem helfen? Ich habe es hier beschrieben.

        Das kann ich dir leider nicht sagen, weil ich damit auch nur ganz geringe Erfahrungen habe. Ich weiß nur, dass die Zuordnung der Position zu den Umschalttasten(kombinationen) auch konfiguriert werden kann, und dass einige meiner Versuche, Tasten zu belegen nicht funktioniert haben, wobei es egal war, ob ich es an 3. und 4. oder 5. und 6. Position probiert habe. Ich habe da auch nicht durchgesehen bzw. eine verständliche Anleitung gefunden, wie das Xmodmap zu konfigurieren ist.
        Außerdem halten sich (zumindest bei mir) nicht alle Programme bzw. die darunterliegenden Software-Bibliotheken an diese X-Grundeinstellungen. (ZendStudio beispielsweise will partout kein Backtick von der Tastatur lesen (nur aus der Zwischenablage) und beim Mozilla hatte ich auch Probleme mit Umschaltkombinationen/Belegungen für Zeichen mit Caron, Breve usw.)

        echo "$verabschiedung $name";

        1. Hallo dedlfix.

          Ich weiß nur, dass die Zuordnung der Position zu den Umschalttasten(kombinationen) auch konfiguriert werden kann, und dass einige meiner Versuche, Tasten zu belegen nicht funktioniert haben, wobei es egal war, ob ich es an 3. und 4. oder 5. und 6. Position probiert habe. Ich habe da auch nicht durchgesehen bzw. eine verständliche Anleitung gefunden, wie das Xmodmap zu konfigurieren ist.

          Gut zu wissen, dass ich hierbei nicht der einzige bin.

          Dass auch dir keine Lösung bekannt ist, ist schade, aber nicht zu ändern. Dennoch danke fürs Lesen.

          (Wenn es mir zu oft passiert, muss ich das geschützte Leerzeichen wohl wieder verwerfen.)

          Einen schönen Mittwoch noch.

          Gruß, Ashura

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
  2. Hallo Thorsten!
    Ich kenne reguläre Ausdrücke nicht in PHP, aber in PERL.

    Temperature: 86°F / 30°C
    preg_match("/Temperature: (.*?)F / (.*?);C/si", $arr[0], $str);

    Ich weiss nicht, warum du nach einem ; suchst...
    Allgemein findest du reguläre Ausdrücke erklärt unter http://de.selfhtml.org/perl/sprache/regexpr.htm

    Für deinen Fall sollte gehen:
    preg_match("/Temperature: (\d*).F / (\d*).C/si", $arr[0], $str);

    Greets,
    Richard

    1. Für deinen Fall sollte gehen:
      preg_match("/Temperature: (\d*).F / (\d*).C/si", $arr[0], $str);

      Ich habe das mal probiert.
      Stattdessen zeigt er mir dann garnichts mehr an, weder die Zahl, noch das Gradzeichen.

  3. Servus,

    Das ist mein Array [0] => Temperature: 86°F / 30°C

    wenn Deine Temperaturangabe immer zwei Werte in dieser Reihenfolge
    enthält, würde ich gleich nur nach zwei unabhängigen, voneinander
    getrennten natürlichen Zahlen suchen; dadurch ist die Suche an sich
    schneller und Du kannst die Form später noch anpassen, ohne dass Du
    gleich den Ausdruck aushebelst.

    Verbal: '(natürliche Zahl+)alles_was_keine_Zahl_ist(natürliche Zahl+)'

    Grüsse

    1. wenn Deine Temperaturangabe immer zwei Werte in dieser Reihenfolge
      enthält, würde ich gleich nur nach zwei unabhängigen, voneinander
      getrennten natürlichen Zahlen suchen; dadurch ist die Suche an sich
      schneller und Du kannst die Form später noch anpassen, ohne dass Du
      gleich den Ausdruck aushebelst.

      Verbal: '(natürliche Zahl+)alles_was_keine_Zahl_ist(natürliche Zahl+)'

      Nun, ich bekomme die Daten halt so geliefert, aber ich will nur die Celsius Angaben auslesen, die Fahrenheit Temperatur ist in meinem Fall irrelevant.
      Dein Ansatz ist auf jeden Fall gut, da ich ja dann, wenn ich das richtig verstehe, die beiden Werte in zwei Variablen hätte und dann wieder auslesen könnte, nur habe ich im Moment noch nicht so wirklich eine Ahnung wie ich preg_replace (oder was man da auch immer am besten nimmt) benutzen soll.

      1. Servus,

        Nun, ich bekomme die Daten halt so geliefert, aber ich will nur die
        Celsius Angaben auslesen, die Fahrenheit Temperatur ist in meinem
        Fall irrelevant.

        dann brauchst gar nicht mal eine Ersetzung, sondern kannst gleich mit
        preg_match arbeiten.

        $ausdruck (verbal) = (zahl+)nicht+(zahl+)

        z.Bsp.: preg_match( '//', $text, $ergebnisse )

        $ergebnisse ist ein Array, in dem ab Index 1 die einzelnen ()-Paare
        in der Reihenfolge ihres Auftretens im Ausdruck aufgelistet sind.

        Wenn es gar nicht klappt, zeige mal das genaue Beispiel mit dem Du es
        versuchst.

        Grüsse

        1. Hallo,

          hier ist der Quelltext an dem ich am verzweifeln bin:

          <?PHP
          $url = "http://deutsch.wunderground.com/auto/rss_full/global/stations/10708.xml";
          $content = implode("", file($url));

          preg_match_all("/<item>(.*?)</item>/si", $content, $results);
          preg_match("/<description>(.*?)</description>/si", $results[1][0], $desc);

          $arr = explode(" | ",$desc[1]);

          /*
           * echo '<pre>' . print_r($arr, true) . '</pre>';
           *
           * Array
           * (
           *     [0] => Temperature: 86°F / 30°C
           *     [1] => Humidity: 74%
           *     [2] => Pressure: 29.83in / 1010hPa
           *     [3] => Conditions: Partly Cloudy
           *     [4] => Wind Direction: ESE
           *     [5] => Wind Speed: 5mph / 7km/h
           *     [6] => Updated: 10:00 PM PHT
           * )
           */

          preg_match("/Temperature: (.*?)F / (.*?);C/si", $arr[0], $str);
          $wetter['temp'] = $str['2'];

          preg_match("/Conditions: (.*)/si", $arr[3], $str);
          $wetter['verh'] = $str['1'];

          preg_match("/Wind Direction: (.*)/si", $arr[4], $str);
          $wetter['windr'] = $str['1'];

          preg_match("/Wind Speed: (.*?)mph / (.*?)km/h/si", $arr[5], $str);
          $wetter['windg'] = $str['2'];

          preg_match("/Pressure: (.*?)inch / (.*?)hPa/si", $arr[2], $str);
          $wetter['press'] = $str['2'];

          echo '<pre>' . print_r($wetter, true) . '</pre>';
          ?>

          1. Servus,

            Schaue Dir bitte in der Doku Deiner Wahl die Wirkungsweise

            • von Charakterklassen
            • des Carets ^
            • des '+' Quantifizierers, und
            • der Klammernpaare

            an. Das folgende Beispiel sollte funktionieren.

            <?php

            $text = 'Temperature: 86°F / 30°C';
            $ausdruck = '/([0-9]+)[^0-9]+([0-9]+)/';

            if ( preg_match( $ausdruck, $text, $ergebnis ) )
            {
                echo '<pre>';
                print_r( $ergebnis );
                echo '</pre>';
            }

            ?>

            Grüsse

            1. Schaue Dir bitte in der Doku Deiner Wahl die Wirkungsweise

              • von Charakterklassen
              • des Carets ^
              • des '+' Quantifizierers, und
              • der Klammernpaare

              an.

              Vielen Dank erstmal für deine Hilfe und deine Ratschläge. Ich werde wohl noch viel zu lernen haben, aber es hört sich alles sehr interessant an.

              Inzwischen bekomme ich sogar eine Ausgabe angezeigt, die auch nur aus einer Zahl besteht, allerdings lautet diese Zahl 176 obwohl sie eigentlich 19 lauten sollte.

              Hier mein Quelltext:

              preg_match("/([0-9]+)[^0-9]+([0-9]+)/", $arr[0], $str);
              $wetter['temp'] = $str['2'];

              Liebe Grüße,
              Thorsten

              1. Servus,

                Inzwischen bekomme ich sogar eine Ausgabe angezeigt, die auch nur
                aus einer Zahl besteht, allerdings lautet diese Zahl 176 obwohl sie
                eigentlich 19 lauten sollte.

                Hier mein Quelltext:

                preg_match("/([0-9]+)[^0-9]+([0-9]+)/", $arr[0], $str);
                $wetter['temp'] = $str['2'];

                $str['2'] <- in einem numerischen Index brauchst Du keine Anführungs-
                zeichen; $str ist jetzt ein Array mit den Ergebnissen der Suche,
                welches von preg_match angelegt wird. Der erste Wert in diesem
                Array (Index 0), enthält den gesamten Bereich des Strings, welcher
                durch den Ausdruck beschrieben wird - einschliesslich der Substrings
                in den Klammern.

                In $str[0] kommt also ebenfalls eine 176 statt einer 19 vor?

                Grüsse

                1. In $str[0] kommt also ebenfalls eine 176 statt einer 19 vor?

                  Nein, dort kommt "66°" raus

                  Liebe grüße

                  1. Servus,

                    In $str[0] kommt also ebenfalls eine 176 statt einer 19 vor?

                    Nein, dort kommt "66°" raus

                    da ist etwas faul im Staate Dänemark. ;)

                    Entweder Du benutzt in Deinem Beispiel irgendeine Art von Character-
                    encoding oder Maskierung von Zeichen, die Du nicht prüfst bzw. hier
                    nicht erwähnt hast, oder Du machst inzwischen etwas ganz anderes.

                    Zeige bitte noch mal ein genaues, ausführbares Beispiel mit dem exakten
                    Text, der hier das unvorhergesehene Verhalten provoziert, und dem
                    preg_match samt Ausdruck.

                    Grüsse

                    1.   
                      <?  
                        
                      $url = "http://deutsch.wunderground.com/auto/rss_full/global/stations/10708.xml";  
                      $content = implode("", file($url));  
                        
                      preg_match_all("/\<item>(.*?)\<\/item\>/si", $content, $results);  
                      preg_match("/\<description\>(.*?)\<\/description\>/si", $results[1][0], $desc);  
                        
                      $arr = explode(" | ",$desc[1]);  
                        
                      /*  
                       * echo '<pre>' . print_r($arr, true) . '</pre>';  
                       *  
                       * Array  
                       * (  
                       *     [0] => Temperature: 86°F / 30°C  
                       *     [1] => Humidity: 74%  
                       *     [2] => Pressure: 29.83in / 1010hPa  
                       *     [3] => Conditions: Partly Cloudy  
                       *     [4] => Wind Direction: ESE  
                       *     [5] => Wind Speed: 5mph / 7km/h  
                       *     [6] => Updated: 10:00 PM PHT  
                       * )  
                       */  
                        
                      preg_match("/([0-9]+)[^0-9]+([0-9]+)/", $arr[0], $str);  
                      $wetter['temp'] = $str['2'];  
                        
                      preg_match("/Conditions: (.*)/si", $arr[3], $str);  
                      $wetter['verh'] = $str['1'];  
                        
                      preg_match("/Wind Direction: (.*)/si", $arr[4], $str);  
                      $wetter['windr'] = $str['1'];  
                        
                      preg_match("/Wind Speed: (.*?)mph \/ (.*?)km\/h/si", $arr[5], $str);  
                      $wetter['windg'] = $str['2'];  
                        
                      preg_match("/Pressure: (.*?)inch \/ (.*?)hPa/si", $arr[2], $str);  
                      $wetter['press'] = $str['2'];  
                        
                        
                      //Weterdaten  
                      switch($wetter['verh'])  
                      {  
                          case 'Partly Cloudy':  
                              $wetter['verh'] = 'Teils wolkig';  
                          break;  
                        
                           case 'Mostly Cloudy':  
                              $wetter['verh'] = '&Uuml;berwiegend wolkig';  
                          break;  
                        
                          case 'Scattered Clouds':  
                              $wetter['verh'] = 'Teils wolkig';  
                          break;  
                        
                          case 'Overcast':  
                              $wetter['verh'] = 'Bew&ouml;lkt';  
                          break;  
                        
                          case 'Clear':  
                              $wetter['verh'] = 'Heiter';  
                          break;  
                        
                           case 'Fog':  
                              $wetter['verh'] = 'Nebel';  
                          break;  
                        
                           case 'Heavy Fog':  
                              $wetter['verh'] = 'Starker Nebel';  
                          break;  
                        
                           case 'Light Fog':  
                              $wetter['verh'] = 'Leicher Nebel';  
                          break;  
                        
                          case 'Thunderstorm':  
                              $wetter['verh'] = 'Gewitter';  
                          break;  
                        
                          case 'Light Thunderstorm':  
                              $wetter['verh'] = 'Leichte Gewitter';  
                          break;  
                        
                          case 'Heavy Thunderstorm':  
                              $wetter['verh'] = 'Starke Gewitter';  
                          break;  
                        
                           case 'Thunderstorms and Rain':  
                              $wetter['verh'] = 'Gewitter mit Regen';  
                          break;  
                        
                           case 'Light Thunderstorms and Rain':  
                              $wetter['verh'] = 'Leichte Gewitter mit Regen';  
                          break;  
                        
                           case 'Light Rain Showers':  
                              $wetter['verh'] = 'Leichte Regenschauer';  
                          break;  
                        
                           case 'Heavy Rain Showers':  
                              $wetter['verh'] = 'Starke Regenschauer';  
                          break;  
                        
                           case 'Light Rain':  
                              $wetter['verh'] = 'Leichter Regen';  
                          break;  
                        
                           case 'Haze':  
                              $wetter['verh'] = 'Tr&uuml;be';  
                          break;  
                        
                            case 'Patches of Fog':  
                              $wetter['verh'] = 'Nebelfelder';  
                          break;  
                        
                            case 'Unknown Percipitation':  
                              $wetter['verh'] = 'Ung. Niederschl&auml;ge';  
                          break;  
                        
                          case 'Light Drizzle':  
                              $wetter['verh'] = 'Leichter Spr&uuml;hregen';  
                          break;  
                        
                          case 'Mist':  
                              $wetter['verh'] = 'Leichter Nebel';  
                          break;  
                        
                          case 'Light Rain Mist':  
                              $wetter['verh'] = 'Leichter Nebel';  
                          break;  
                        
                          default:  
                              $wetter['verh'] = $wetter['verh'];  
                          break;  
                      }  
                        
                        
                      //Windrichtungen  
                      switch($wetter['windr'])  
                      {  
                          case 'North':  
                              $wetter['windr'] = 'Norden';  
                          break;  
                        
                          case 'East':  
                              $wetter['windr'] = 'Osten';  
                          break;  
                        
                          case 'South':  
                              $wetter['windr'] = 'S&uuml;den';  
                          break;  
                        
                           case 'West':  
                              $wetter['windr'] = 'Westen';  
                          break;  
                        
                          case 'SE':  
                              $wetter['windr'] = 'SO';  
                          break;  
                        
                          case 'SSE':  
                              $wetter['windr'] = 'SSO';  
                          break;  
                        
                          case 'NE':  
                              $wetter['windr'] = 'NO';  
                          break;  
                        
                          case 'ESE':  
                              $wetter['windr'] = 'OSO';  
                          break;  
                        
                          case 'NNE':  
                              $wetter['windr'] = 'NNO';  
                          break;  
                        
                          case 'ENE':  
                              $wetter['windr'] = 'ONO';  
                          break;  
                        
                          case 'Calm':  
                              $wetter['windr'] = 'Windstill';  
                          break;  
                        
                          default:  
                              $wetter['windr'] = $wetter['windr'];  
                          break;  
                      }  
                        
                        
                        
                      echo '<pre>' . print_r($wetter, true) . '</pre>';  
                      ?>  
                      
                      

                      ----------------

                      Und heraus kommt dann folgendes:

                      Array
                      (
                          [temp] => 176
                          [verh] => Überwiegend wolkig
                          [windr] => NW
                          [windg] => 11
                          [press] => 1016
                      )

                      1. Servus,

                        *     [0] => Temperature: 86°F / 30°C

                        eben nicht. Der Text, den Dein Skript ausliest ist in diesem Fall
                        'Temperature: 68&#176;F / 20&#176;C' - entweder Du wandelst diese
                        Maskierungen vor dem Suchdurchlauf in das dargestellte Zeichen um,
                        oder Du berücksichtigst diese Formatierung im Regulären Ausdruck.

                        Da Du den Fahrenheit-Wert anscheinend gar nicht mehr einplanst,
                        kannst Du auch gleich per Lookahead nach dem Grad Celsius Wert
                        suchen (bitte Lookarounds, speziell Lookahead und 'non-capturing
                        parantheses' nachschlagen; weiter unten ist auch ein Thread zu
                        RegEx, wo ich versucht habe auf erstere einzugehen).

                        Der relevante Auszug:

                          
                        // schaust Du wohl ;)  
                        echo '<pre>' . print_r( $arr, true ) . '</pre>';  
                          
                        // finde eine natürliche Zahl nur, wenn darauf das Grad-Symbol  
                        // als Zeichen oder Formatierung und das C folgen; der Bereich  
                        // im Lookahead wird nur getestet und tritt nicht im Ergebnis auf  
                        preg_match( '/([0-9]+)(?=(?:&#176;|°)C)/', $arr[0], $str );  
                          
                        echo '<pre>' . print_r( $str, true ) . '</pre>';  
                          
                        $wetter['temp'] = $str[1];  
                        
                        

                        Grüsse

                        1. Alternativ kannst Du das in diesem Fall auch ohne Lookaround machen,
                          da Du hier keine Ersetzung vornimmst und $str ohnehin jede Klammer abbildet.

                            
                          // das ginge also auch, bitte Unterschied bei $str[0] beachten  
                          preg_match( '/([0-9]+)(?:&#176;|°)C/', $arr[0], $str );  
                          
                          

                          Grüsse

                          1. Alternativ kannst Du das in diesem Fall auch ohne Lookaround machen,
                            da Du hier keine Ersetzung vornimmst und $str ohnehin jede Klammer abbildet.

                            // das ginge also auch, bitte Unterschied bei $str[0] beachten
                            preg_match( '/([0-9]+)(?:&#176;|°)C/', $arr[0], $str );

                            
                            >   
                            > Grüsse  
                              
                            Es funktioniert! Vielen vielen Dank!!! Das war sehr nett, dass du dir so viel Zeit genommen hast, um mir zu helfen!  
                            Ich habe mich die ganze Zeit darauf versteift, dass die ganzen Zahlen so formatiert sind wie in dem auskommentierten Bereich. Allerdings hätte mein Wissen auch ansonsten nicht so weit gereicht, es alleine zu lösen.  
                            Jetzt bin ich allerdings, dank dir, um einiges schlauer.  
                              
                            Liebe Grüße,  
                            Thorsten
                            
  4. Hallo Thorsten.

    Das ist mein Array [0] => Temperature: 86°F / 30°C

    […]
    Allerdings brauche ich das ganze nur als "30", also ohne das ° Symbol.

    Also folgendermaßen?

    <?php  
      
    error_reporting(E_ALL);  
    header('content-type: text/plain; charset=utf-8');  
    setlocale(LC_ALL, 'de_DE.UTF-8', 'ge');  
      
    $str_temp = 'Temperature: 86°F / 30°C';  
    $str_end = '°C';  
    $str_start =' / ';  
      
    $int_end = strpos($str_temp, $str_end);  
    $int_start = strpos($str_temp, $str_start);  
      
    if ($int_end !== false and $int_start !== false) {  
      
      $int_end -= strlen($str_temp);  
      $int_start += strlen($str_start);  
      
      $str_temp = substr($str_temp, $int_start, $int_end);  
      
    }  
      
    echo $str_temp; // 30  
      
    ?>
    

    Es muss nicht immer ein regulärer Ausdruck sein.

    Einen schönen Mittwoch noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Servus,

      Es muss nicht immer ein regulärer Ausdruck sein.

      natürlich nicht, allerdings sind sie für flexible Textoperationen
      geradezu prädestiniert. Immer zu aufwendigen (und meist weniger
      intuitiv verständlichen) Konstrukten zu greifen, nur um Reguläre
      Ausdrücke zu vermeiden, halte ich aber für ebenso ungünstig. :)

      Grüsse

  5. Hallo auch...

    ich würde gerne eine Gradzahl auslesen, die dann aber ohne das Gradzeichen dargestellt werden soll.
    Dazu habe ich folgenden Quelltext verwendet:

    Das ist mein Array [0] => Temperature: 86°F / 30°C

    preg_match("/Temperature: (.*?)F / (.*?);C/si", $arr[0], $str);
    $wetter['temp'] = $str['2'];

    Das sollte funktionieren:

    <?php

    $string = 'Temperature: 86°F / 30°C';

    preg_match("/(\d{1,})(?=°C)/", $string, $erg);

    echo $erg[1];

    ?>

    Gruß Helmuth