php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2008

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.12.2007, 11:04  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard RegEx zur Suche von fester Zeichenkette mit Darauffolgendem

Grüß Euch,

ich versuche folgendes zu erreichen:

ich habe einen Array der Form
array(0 => "blablub: 2323", 1 => "Rektaszension: 03h50m18.9596s", 2 => test sonstwas);

ich versuche nun, den Schlüssel des Arrays herauszufinden, in dem die Rektaszension steht, denn ich brauche die Nummer. Diese ist in jedem array anders und es muss mitgeprüft werden, ob "h" "m" und "s" auch in der Zeichenkette stehen.

Mein Regex ist bisher so, funktioniert aber leider nicht und prüft nicht auf die Buchstaben. Bin leider kein Regex-Experte.
foreach....:
"/\sRektaszension.*?)\\r\\n/"
endforeach;

Danke schonmal!
pepe24 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.12.2007, 11:47  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

/Rektaszension:\s*(\d+)h(\d+)m(\d+)s$/
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 04.12.2007, 12:30  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Woran scheiterts?

Mit array_values() kannst du die Werte des Arrays ermitteln, mit explode(":", ..) diese aufsplitten ..
Zergling-new ist offline  
Alt 04.12.2007, 12:44  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Hallo Slava!

Man, Dich trifft man ja auch in jedem Forum.
Vielen Dank. Dein Regex hat teilweise funktioniert - nur teilweise, weil ich die Umstände ein bisschen widrig beschrieben habe.

Folgendes benutze ich nun mit Erfolg:
~(?<=Rektaszension: ).*~

*EDIT:

Hallo Zergling,
ich bin nicht unbedingt ein Freund von regulären Ausdrücken; Allerdings sollte hier die Berechnungsgeschwindigkeit zw. String/ Arrayfunktionen und dem schlanken regex nicht so unterschiedlich sein.

Eigentlich ist Deine Möglichkeit bei Operationen schneller, was hier nicht so zählt. Mit den beiden regex-Zeilen habe ich den Code nun ein bisschen schlanker gehalten.

Vielen Dank auch an Dich!

Grüße
pepe24 ist offline  
Alt 04.12.2007, 14:47  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

PHP-Code:
<?
$array 
= array(=> "blablub: 2323"=> "Rektaszension: 03h50m18.9596s"=> 'test sonstwas');

$found preg_grep ($pattern '#^Rektaszension:\s*?(.*)#' $array); // Suche
// Schlüssel des ersten Matches
echo key ($found); 
// Wert des ersten Matches, also 03h50m18.9596s
echo preg_replace ($pattern '$1' reset ($found));
nikosch ist offline  
Alt 04.12.2007, 15:40  
CIX88
Gast
 
Beiträge: n/a
Standard

Zitat:
und es muss mitgeprüft werden, ob "h" "m" und "s" auch in der Zeichenkette stehen
Hmmm wie wollt ihr das prüfen, wenn (.*?) da steht ?
Dann könnte da alles mögliche stehen
Oder hab ich was falsch verstanden ?
 
Alt 04.12.2007, 16:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Und offensichtlich hats sich der TE anders überlegt
Zitat:
Vielen Dank. Dein Regex hat teilweise funktioniert - nur teilweise, weil ich die Umstände ein bisschen widrig beschrieben habe.

Folgendes benutze ich nun mit Erfolg:
~(?<=Rektaszension: ).*~
nikosch ist offline  
Alt 04.12.2007, 21:23  
Erfahrener Benutzer
 
Registriert seit: 21.07.2005
Beiträge: 209
pepe24
Standard

Hallo CIX, hallo Nikosch,

ich war wohl anfangs ein bisschen über's Ziel hinausgeschosen. Meine Anwendung des Regex prüft nun nicht nach h, m und s. Das sollte ich sicherlich noch ändern. Hat jemand evtl einen guten Einfall, ohne dass der Regex zu einem "Monster" heranwächst?

.* ist nicht allzu geeignet dafür.

Danke Euch für die engagierte Hilfe.
pepe24 ist offline  
Alt 05.12.2007, 00:50  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.989
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Slavas Ausdruck traf es schon fast. Problem war wahrscheinlich nur das nicht unterstützte Komma für Sekunden - /Rektaszension:\s*(\d+)h(\d+)m(\d+)s$/ untersttützt nur ganzzahlige Sekunden.

Versuch mal:
PHP-Code:
<?
// erlaubt . und , für Nachkommastellen
$found preg_grep ($pattern '#^Rektaszension:\s*?(\d+)h(\d+)m((\d+)(?:[\.,](\d+)))s#' $array);
/*
Über $1-$5 sind jetzt die Winkel ablesbar:
$1 h
$2 m
$3 s - komplett
$4 s - Ganzzahlanteil
$5 s - Nachkommastellen
*/
echo preg_replace ($pattern '$1 h $2 m $3 s' reset ($found));
Mit einem i hinter dem Zweiten # könntest Du bspw.auch die Unabhängigkeit von Groß/Kleinschreibung erlauben.
Leider führst Du nicht genau aus, was passieren soll, wenn das h-m-s Muster nicht vollständig ist.
nikosch ist offline  
Alt 05.12.2007, 15:40  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Zitat:
Zitat von nikosch77
Slavas Ausdruck traf es schon fast. Problem war wahrscheinlich nur das nicht unterstützte Komma für Sekunden - /Rektaszension:\s*(\d+)h(\d+)m(\d+)s$/ untersttützt nur ganzzahlige Sekunden.
stimmt ,
ich habe es nicht berücksichtigt, dass in sekunden ein float steht.
__________________
Slava
http://bituniverse.com
Slava ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Suche ein bestimmtes Regex Chr!s PHP Tipps 2005 5 21.05.2005 12:01
Suche in einer Zeichenkette PHP Tipps 2005 2 04.03.2005 13:52
Regex für attribute in quelltexten robo47 PHP Tipps 2005 6 27.01.2005 18:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php regex nur teilweise, nur float zulassen php preg, regex nach fester zeichenfolge suchen, regex zeichenfolge oder, regex nicht zeichenkette

Alle Zeitangaben in WEZ +2. Es ist jetzt 19:12 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.