php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 16-12-2008, 03:21
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard String druchsuchen und ggf. teile davon entfernen

Hallo zusammen,


Mal wieder - sonst hätte ich kaum eine Frage - stehe ich tierisch aufm Schlauch.

Folgendes Vorhaben kurz geschildert

Ich habe String der im grossen und ganzen meist ähnlich ausschaut. Bsp:

NAME1: TEXT-TEXT-TEXT *644938548 (14.12.2008 19:21:22)
NAME2: TEXT-TEXT-TEXT *438.832.192 MEHR TEXT (02.12.2008 19:37:37)
NAME3: TEXT-TEXT-TEXT 509.687.198 MEHR TEXT (29.09.2008 16:08:54)
NAME4: TEXT-TEXT (15.08.2008 16:46:23)


Das Endziel wäre es nun, dass ich jede Zeile einzeln verwenden/weiterverarbeiten kann. Jedoch gibt es dabei einiges zu beachten:

1. NAME muss entfernt werden (bereits gelöst)
PHP-Code:
$text $_POST['inhalt'];
$zeile explode("\r\n"$text);
foreach (
$zeile AS $ntrennen) {
    
$ohnename explode(":"$ntrennen2);
    echo 
"$ohnename[1] <br /><br />";

2. Die immer 9-stellige Nummer welche nicht immer gleich geschrieben wird und nicht immer am selben Ort in der Zeile steht (aber auch nicht immer vorhanden ist) muss zum einen aus der Zeile entfernt und zum anderen als Variable zwecks weiterverarbeitung ver-/gemerkt werden
Mögliche Versionen der 9-stelligen Nummer:
Mit Stern: *123456789
Mit Stern und Punkten: *123.456.789
Ohne Stern mit Punkten: 123.456.789
Ohne Stern ohne Punkte: 123456789

3. Das Datum, welches immer am Ende der Zeile steht ebenfalls (Format ist ebenfalls immer das selbe) entfernen, zu einem UNIX-Timestamp umwandeln und in einer Variable zwischenspeichern.


Ich komme hier einfach auf keinen grünen Zweig, finden keinen wirklich schlauen und/oder für mich möglichen (von den Fähigkeiten her..) Ansatz um Punkt 2 und 3 umzusetzen. Daher die Frage an euch, wie ihr an sowas heran gehen würdet.

Gruss & Danke im Voraus für Ratschläge, Ideen, etc. :-)
Mit Zitat antworten
  #2 (permalink)  
Alt 16-12-2008, 07:33
MelloPie
 PHP Master
Links : Onlinestatus : MelloPie ist offline
Registriert seit: Jan 2002
Ort: Hessen
Beiträge: 4.380
MelloPie ist zur Zeit noch ein unbeschriebenes Blatt
Standard

um die Zahl und das Datum zu entfernen benutzt Du am besten einen regulären ausdruck.
*123.456.789 entspricht dann etwa sowas \*?[0-9\.]{9,11}
Wobei Du hier auch das Datum treffen kannst, also würde ich das Datum zuerst behandeln oder Du verfeinerst den Ausdruck
Das Datum ist auch einfach, es steht immer in den klammern und hat immmer das gleiche Format oder es steht immer am schluss und ist immer gleich lang, dann kannst Du auch nur mit substr($str,-20,19) und ähnlichen Funktionen arbeiten
__________________
Beantworte nie Threads mit mehr als 15 followups...
Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

Geändert von MelloPie (16-12-2008 um 07:54 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 16-12-2008, 17:29
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Hallo,


Punkt 3 (Datum raussuchen) habe ich nun gelöst - die verarbeitung zum Timestamt ist dann nur noch Kleinkram..

PHP-Code:
$ohnename explode(":"$ntrennen2);
$laenge strlen($ohnename[1]);
$start $laenge 21;
$datum substr($ohnename[1], $start21); 
Punkt 2 (Nummer suchen) bereitet mit aber weiterhin Probleme. Der vorgegebene preg_match (danke übrigens dafür) funktioniert nur dann korrekt, wenn im Text davor keine Zahlenreihe/handgeschriebenes Datum auftaucht. Zugegeben, daran habe ich auch nicht gedacht bzw. es nicht beachtet. Wenn im Text nun also zb. ein 19.12.2008 vorkommt schnappt sich das der regex und gibt es mir als Nummer zurück. Ich muss zugeben, RegEx ist für mich ein Buch mit zu vielen Seiten und das Thema ist bekanntlich nicht ohne. Kann man diesen noch mehr 'einschränken' und/oder einen genaueren 'Filter' geben den er zu beachten hat?


Gruss
Mit Zitat antworten
  #4 (permalink)  
Alt 16-12-2008, 20:06
medium22
 Registrierter Benutzer
Links : Onlinestatus : medium22 ist offline
Registriert seit: Mar 2006
Beiträge: 308
medium22 zeigte ein beschämendes Verhalten in der Vergangenheit
Standard

Die Not macht erfinderisch

Da ich mit RegEx wie bereits gesagt auf Kriegfuss stehe habe ich mir versucht anders zu helfen - in der Tat sogar erfolgreich, auch wenns nicht optimal ist.

Das ganze mal gepostet:
PHP-Code:
$text "NAME1: TEXT-23.11.2008-TEXT *644938548 (14.12.2008 19:21:22) \n 
NAME2: TEXT-TEXT-TEXT *438.832.192 MEHR TEXT (02.12.2008 19:37:37) \n 
NAME3: TEXT-TEXT-TEXT 509.687.198 MEHR TEXT (29.09.2008 16:08:54) \n
 NAME4: TEXT-TEXT (15.08.2008 16:46:23)"
$zeile explode("\r\n"$text); // Zeilenumbrüche entfernen
foreach ($zeile AS $ntrennen) {
    
$ohnenick explode(":"$ntrennen2); // NAME entfernen
    
$pattern '#\*?[0-9\.]{9,11}#is';  // Nach Nummer suchen
    
$result preg_match_all($pattern$ohnenick[1], $subpattern);
    
$anzahl count($subpatternTRUE);
    foreach (
$subpattern[0] AS $inhalt) {
        
$unerlaubt = array("*"=>"""."=>""":"=>"""("=>""")"=>""" "=>""); 
        
$nr strtr($inhalt$unerlaubt);  // Unterlaubte Zeichen aus Nummer entfernen
        
$laengezahl strlen($nr);
        if (
$laengezahl '9' || $nr == $nummer) { // Prüfen ob Nummer auch 9 Zeichen enthält, sonst verwerfen
            
unset($nr); 
        }
        else {
            
$nummer $nr;
        }
    }
    
$laenge strlen($ohnenick[1]);  // Stringlänge ermitteln
    
$start $laenge 21;  // Startposition für substr ermitteln
    
$datum substr($ohnenick[1], $start21);
    echo 
"$ohnenick[1] <br /><b>NR:</b> $nummer <br /><b>Datum:</b> $datum<br /><br />";
    unset(
$nummer);

Mit Sicherheit überarbeitungswürdig - wenn man von RegEx mehr verstehen würde. *g*
Mit Zitat antworten
  #5 (permalink)  
Alt 19-12-2008, 11:38
MarkusW
 Newbie
Links : Onlinestatus : MarkusW ist offline
Registriert seit: Feb 2006
Beiträge: 99
MarkusW ist zur Zeit noch ein unbeschriebenes Blatt
Standard

hier mal mit RegEx:

PHP-Code:
$str 'NAME1: TEXT-TEXT-TEXT *644938548 (14.12.2008 19:21:22)
NAME2: TEXT-TEXT-TEXT *438.832.192 MEHR TEXT (02.12.2008 19:37:37)
NAME3: TEXT-TEXT-TEXT 509.687.198 MEHR TEXT (29.09.2008 16:08:54)
NAME4: TEXT-TEXT (15.08.2008 16:46:23)'
;

// parse lines               1:text     2:day   3:month  4:year  5:hour  6:min    7:sec
if (preg_match_all('@^.+?:\s*(.*?)\s*\((\d{2})\.(\d{2})\.(\d{4}) (\d{2}):(\d{2}):(\d{2})\)\s*$@m'$str$hits)) {
    for (
$i 0$i count($hits[0]); $i ++) {
        
// parse number   1:text1     2:number                3:text2
        
if (preg_match('@^(.*?)\s*\*?(\d{3}\.?\d{3}\.?\d{3})\s*(.*?)$@'$hits[1][$i], $sub)) {
            
$text trim($sub[1].' '.$sub[3]);
            
$number intval(str_replace('.'''$sub[2]));
        }
        else {
            
$text $hits[1][$i];
            
$number 0;
        }
        
$timestamp mktime($hits[5][$i],$hits[6][$i],$hits[7][$i],$hits[3][$i],$hits[2][$i],$hits[4][$i]);

        echo 
'$text: '.$text.'<br />';
        echo 
'$number: '.$number.'<br />';
        echo 
'$timestamp: '.$timestamp.'('.date('Y-m-d H:i:s'$timestamp).')<br /><br />';
    }

edit: blöderweise nimmt das forum alle backslashes raus. du musst dir in den ausdrücken vor jedem "d" und "s" einen vorstellen und an der stelle wo zwei "*" aufeinander folgen vor dem zweiten. Außerdem gehören bei (\d{3}\.?\d{3}\.?\d{3}) vor den punkten, muss aber in dem fall nicht sein.

edit2: anscheinend nur in dem php-block. also hier die ausdrücke:
'@^.+?:\s*(.*?)\s*\((\d{2})\.(\d{2})\.(\d{4}) (\d{2}):(\d{2}):(\d{2})\)\s*$@m'
'@^(.*?)\s*\*?(\d{3}\.?\d{3}\.?\d{3})\s*(.*?)$@'

Geändert von MarkusW (19-12-2008 um 11:45 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:29 Uhr.