Stundenangabe anstatt Jahr aus einem String extrahieren


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

tklustig

Erfahrenes Mitglied
#1
Hallo Leute, folgender Code extrahiert das Jahr aus einem gegebenen String:

Website.jpg
Code:
PHP:
$year = preg_replace('/^[^\d]*(\d{4}).*$/', '\1', $model->uhrzeit);
var_dump($year);
var_dump($model->uhrzeit);
Wie muss preg_replace abgeändert werden ,damit die Stundenanzahl anstatt des Jahres extrahiert wird. Im obigen Falle also 13 ? Da das Format nicht zwingend immer so angegeben ist, wie gezeigt, kann ich nicht mit anderen Funktionen hantieren :=(
 

Sempervivum

Erfahrenes Mitglied
#2
In dem Fall würde ich eher zu preg_match greifen:
PHP:
    $uhrzeit = 'ohnjiwh 2019-01-15 23:07:14 oiwrmnhj';
    preg_match("/(\d{4})-\d{2}-\d{2} +(\d{2}):\d{2}:\d{2}/", $uhrzeit, $matches);
    $year = $matches[1];
    $hour = $matches[2];
    var_dump($matches);
    var_dump($year);
    var_dump($hour);
Du schreibst "Da das Format nicht zwingend immer so angegeben ist, wie gezeigt " - dann musst Du u. U. die Regex allgemeiner formulieren, z. B. die Sekunden weglassen. Aber je allgemeiner formuliert, um so leichter kann es zu Fehlern kommen.
 

tklustig

Erfahrenes Mitglied
#3
In dem Fall würde ich eher zu preg_match greifen:
PHP:
    $uhrzeit = 'ohnjiwh 2019-01-15 23:07:14 oiwrmnhj';
    preg_match("/(\d{4})-\d{2}-\d{2} +(\d{2}):\d{2}:\d{2}/", $uhrzeit, $matches);
    $year = $matches[1];
    $hour = $matches[2];
    var_dump($matches);
    var_dump($year);
    var_dump($hour);
Du schreibst "Da das Format nicht zwingend immer so angegeben ist, wie gezeigt " - dann musst Du u. U. die Regex allgemeiner formulieren, z. B. die Sekunden weglassen. Aber je allgemeiner formuliert, um so leichter kann es zu Fehlern kommen.
Wie kommt man denn zu so einem Regex? Meines ist schon kompliziert, das Deinige toppt das Meinige allerdings um Längen:sneaky:(y);)
 

Yaslaw

n/a
Moderator
#5
Kompliziert? Oh nein, dass ist noch nicht kompliziert
Nur mal so Beispiele mit denen ich arbeite
Code:
/,?(?!\\)(|lluN|eslaf|eurt|(['""#](?![\\,])).+?\1(?!\\)|[\d\.]*|.*?)\s*(?:>=|[:=])\s*((['""](?!\\)).+?\4(?!\\)|(\](?!\\)).+?\[(?!\\)|[\w\s-]+)/ig

/\s*(#A|#C|#D|)([\[\{])([^\[\{\]\}]*)[\]\}]/i

/^([{$S}]?)\s*(\d+[+-]?E)?\s*(\d+(?:([{$D}])\d{3}([{$T}])\d+|([{$D}])\d{1,3}()|)[\d{$T}]*)\s*([{$S}]?)$/i
Um zu Testen empfehle ich dir übrigens die Seite Regex101 - online regex editor and debugger. Dort kann man in aller Ruhe sein Pattern testen und hat nebenan auch noch erklärungen zum Aufbau deines Patterns.
Hier als Beispiel der Pattern von Sempervivum: Regex101 - online regex editor and debugger
 

tklustig

Erfahrenes Mitglied
#6
Danke für den Link. Die große Frage bleibt: Wie gehst du strukturiert vor, um zu derartigen Regex-Ausdrücken zu kommen. Übung, sicherlich, aber wie übst du?
Zu Semperivum:
Wozu sollte man eine Mailadreese mittels Regex valideren? Ich validiere meine Mailadressen so:
PHP:
function ValidateMail($adress){
    if (filter_var($adress, FILTER_VALIDATE_EMAIL))
        return true;
    return false;
}
P.S.: Bin schon seit langem auf der Suche nach einer PHP Funktion, die die Mailadresse nicht nur validiert sondern gleichzeitig noch prüft, ob sie existiert. Lösungen im Netz haben, egal in welcher Sprache, nie funktioniert. Auch dann nicht, wenn ich einen Mailserver kontaktiere:unsure:
Hier der Code in C#, der allerdings nicht funktioniert. Sollte jemand eine Methode kennen(egal, ob in C# oder PHP), die funktioniert: Gerne veröffentlichen!
C#:
using System;
using System.Diagnostics;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            bool doTwice = false;
            string adress = "tklustig@web.de";
            if (isEmail(adress) && checkIfMailExists(adress, "MX")) {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Mailadresse ist valide und existent");
                doTwice = true;
            }
            else {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Mailadresse ist entwender invalide oder inexistent");

            }
            if (isEmail(adress) && doTwice) {
                string fb = checkIfMailExists(adress);
                if (!String.IsNullOrEmpty(fb)) {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(fb);
                }
                else {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Mailadresse ist valide und existent");
                }
            }
            Console.ReadKey();
        }
        protected static bool isEmail(string inputEmail) {
            inputEmail = inputEmail ?? string.Empty; ;
            string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                  @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                  @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            Regex re = new Regex(strRegex);
            if (re.IsMatch(inputEmail))
                return true;
            else
                return false;
        }
        protected static bool checkIfMailExists(string adress, string recType = "MX") {
            string[] host = (adress.Split('@'));
            string hostname = host[1];
            bool result = false;
            try {
                using (Process proc = new Process()) {
                    proc.StartInfo.FileName = "nslookup";
                    proc.StartInfo.Arguments = string.Format("-type={0} {1}", recType, hostname);
                    proc.StartInfo.CreateNoWindow = true;
                    proc.StartInfo.ErrorDialog = false;
                    proc.StartInfo.RedirectStandardError = true;
                    proc.StartInfo.RedirectStandardOutput = true;
                    proc.StartInfo.UseShellExecute = false;
                    proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                    proc.OutputDataReceived += (object sender, DataReceivedEventArgs e) =>
                    {
                        if ((e.Data != null) && (!result))
                            result = e.Data.StartsWith(hostname);
                    };
                    proc.ErrorDataReceived += (object sender, DataReceivedEventArgs e) =>
                    {
                        if (e.Data != null) {
                            //read error output here, not sure what for?
                        }
                    };
                    proc.Start();
                    proc.BeginErrorReadLine();
                    proc.BeginOutputReadLine();
                    proc.WaitForExit(30000); //timeout after 30 seconds.
                }
            }
            catch {
                result = false;
            }
            return result;
        }
        protected static string checkIfMailExists(string adress) {
            TcpClient tClient = new TcpClient("gmail-smtp-in.l.google.com", 25);
            const string CRLF = "\r\n";
            byte[] dataBuffer;
            string responseString;
            NetworkStream netStream = tClient.GetStream();
            StreamReader reader = new StreamReader(netStream);
            responseString = reader.ReadLine();
            /* Perform HELO to SMTP Server and get Response */
            dataBuffer = Encoding.ASCII.GetBytes("HELO KirtanHere" + CRLF);
            netStream.Write(dataBuffer, 0, dataBuffer.Length);
            responseString = reader.ReadLine();
            dataBuffer = Encoding.ASCII.GetBytes("MAIL FROM:<" + adress + ">" + CRLF);
            netStream.Write(dataBuffer, 0, dataBuffer.Length);
            responseString = reader.ReadLine();
            /* Read Response of the RCPT TO Message to know from google if it exist or not */
            dataBuffer = Encoding.ASCII.GetBytes("RCPT TO:<" + adress + ">" + CRLF);
            netStream.Write(dataBuffer, 0, dataBuffer.Length);
            responseString = reader.ReadLine();
            /* QUITE CONNECTION */
            netStream.Write(dataBuffer, 0, dataBuffer.Length);
            tClient.Close();
            if (getResponseCode(responseString) > 500) {
                return responseString;
            }
            return String.Empty;
        }

        private static int getResponseCode(string responseString) {
            return int.Parse(responseString.Substring(0, 3));
        }
    }
}
 
Zuletzt bearbeitet:
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…