Gradzeichen mit preg_replace ersetzen?
Thorsten
- php
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
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";
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?
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
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";
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
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
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.
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
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.
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
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>';
?>
Servus,
Schaue Dir bitte in der Doku Deiner Wahl die Wirkungsweise
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
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
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
In $str[0] kommt also ebenfalls eine 176 statt einer 19 vor?
Nein, dort kommt "66°" raus
Liebe grüße
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
<?
$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'] = 'Überwiegend wolkig';
break;
case 'Scattered Clouds':
$wetter['verh'] = 'Teils wolkig';
break;
case 'Overcast':
$wetter['verh'] = 'Bewö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übe';
break;
case 'Patches of Fog':
$wetter['verh'] = 'Nebelfelder';
break;
case 'Unknown Percipitation':
$wetter['verh'] = 'Ung. Niederschläge';
break;
case 'Light Drizzle':
$wetter['verh'] = 'Leichter Sprü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ü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
)
Servus,
* [0] => Temperature: 86°F / 30°C
eben nicht. Der Text, den Dein Skript ausliest ist in diesem Fall
'Temperature: 68°F / 20°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]+)(?=(?:°|°)C)/', $arr[0], $str );
echo '<pre>' . print_r( $str, true ) . '</pre>';
$wetter['temp'] = $str[1];
Grüsse
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]+)(?:°|°)C/', $arr[0], $str );
Grüsse
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]+)(?:°|°)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
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
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
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