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
  #16 (permalink)  
Alt 02-01-2009, 12:54
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Erstmal: Prosit Neujahr, alle miteinander!

Zitat:
Original geschrieben von ghostgambler
Lieber 3 String-Funktionen auf einen String als einen Regex von einer Zeile Länge.
(Wieso kommt mir jetzt der Spruch "Lieber [aA]rm dran, als Arm ab!" in den Sinn ... ;-))

Mhmmm, mal sehen:

Du fragst 4 Bedingungen ab, die du über drei Zeilen verteilst, ich nur eine auf einer Zeile.

Wenn wir mal nur die "Kernabfragen" vergleichen:

strspn($string, "abcdefghijklmnopqrstuvwxyz0123456789_.") == $len;
vs.
preg_match('/\A(?=[^\.]{0,10}(?:\.[^\.]{0,10})?)[a-z0-9_.]{4,10}\z/', $string);

Okay, du hast 13 Tastendrücke gespart. ;-)
Probleme bekämst du nur, wenn sich die Anforderung ändern würde, und bspw. zusätzlich Großbuchstaben erlaubt werden würden.

Nebenbei könnte man den PCRE natürlich auch umbrechen und Newbie-tauglich formatieren. Guckst du hier:
PHP-Code:
$pcre '/\A                          # am Anfang verankern
    (?=[^\.]{0,10}(?:\.[^\.]{0,10})?) # maximal ein Punkt darf vorhanden sein[1]
                                      # UND
    [a-z0-9_.]                        # nur die Zeichen a--z, 0--9, _ und . dürfen vorkommen
    {4,10}                            # es dürfen 4--10 Zeichen sein, 
    \z/x'
;                           // am Ende verankern
/* 
für noch genauere Erläuterungen siehe PCRE-Manual zu 
Lookahead-Assertions "(?=...)" und  
"non-capturing subpatterns" (?:...)".
*/ 
Zitat:
Entwicklungs-Kosten sind deutlich höher als Hardware-Kosten.
Ja, da scheiden sich die Geister. Es ging mir auch mehr darum, denen, die immer noch das uralte Vorurteil "PCRE sind laaaangsam" vor sich hertragen, zu zeigen, dass das nicht immer so sein muss. Zum Teil hat wohl die ereg-Funktionsfamilie in PHP zu diesem Vorurteil beigetragen.

Wenn du aber schon von Entwicklungsaufwand (oder -kosten) sprichst, bedenke: Ein PCRE ist einfacher portierbar als ein Haufen byte-orientierter String-Funktionen, die sich so fast nur in PHP finden. Der PCRE dagegen lässt sich 1:1 in alle Sprachen übernehmen, die die PCRE-Lib ansprechen können, z.B. C(++), Objective-C, Delphi/FreePascal, RealBasic, was-weiß-ich-nicht-noch-alles ... und Perl sowieso.

Nach diesem Lieber-Hardwarekosten-statt-Softwarekosten-Paradigma wären alle C- und erst recht C++-Programmierer arbeitslos. Und ich halte Hardware immer noch für eine physisch begrenzte Ressource. Dass das heut zu Tage gerne anders gesehen wird, ist mir aber schon klar. ;-)

Zitat:
Es geht übrigens auch ganz ohne preg:
PHP-Code:
function check($string) {
  
$len strlen($string);
  return 
$len >= && $len <= 10
    
&& strpos($string".") === strrpos($string".")
    && 
strspn($string"abcdefghijklmnopqrstuvwxyz0123456789_.") == $len;

Danke, strspn() war die Funktion, die ich gesucht, aber nicht gefunden hatte -- um die Funktion des Regulären Ausdruckes rein String-Funktionen-basiert zu machen. Sie scheitert allerdings spätestens bei Umlauten an der Unicode-Hürde, wo wir dann wieder bei den Entwicklungskosten wären ... ;-)

Zitat:
Original geschrieben von CadEx
Diese Idee mit dem strpos() === strrpos() finde ich echt kreativ!

Aber könnte man nicht einfach ein substr_count() == 1 machen?
Oder hat die andere Variante irgendwelche Vorteile?
Sie prüft ja das Vorhandensein von EINEM ('position === position') oder KEINEM ('FALSE === FALSE') Punkt.
Bei substr_count() müsstest du das Ergebnis auf Gleichheit mit 1 oder 0 prüfen. Das ginge in einem Rutsch mit 'substr_count() < 2', wenn sich substr_count() auf ewig an die Angaben im Handbuch hält, dass es INTeger zurückliefert, die größer oder gleich 0 sind.

*nachtrag*
Irgendwie bin ich heute zu langsam ... ;-)


Zitat:
Original geschrieben von ghostgambler
Nebenbei machen wir uns jetzt bewusst, dass diese Einschränkung für den vorliegenden Fall vollkommen irrelevant ist.
Oder möchten Sie mir einen String kreieren, wo die eine Funktion einen Punkt an der ersten Stelle findet, die zweite Funktion dann jedoch keinen Punkt findet? Ich glaube ich vermag einwandfrei zu beweisen, dass es einen derartigen String nicht geben wird... entweder liefern beide Funktionen False, oder sie liefern beide einen numerischen Wert.
Mach mal. ;-) Nein -- Sie[1] haben natürlich recht. Wenn (mindestens) ein Punkt vorhanden ist, dann sollten beide Funktionen kein FALSE liefern.

Zitat:
Übrigens, Forenregeln!
Die hier?
Keine horizontalen Scrollbalken
Informatiker sind FAUL! Folglich mag hier niemand eine horizontale Scrollbar nach rechts bewegen. Achtet also beim Posten darauf, dass ihr bei "breitem" Quelltext entsprechende Umbrüche in den Text einfügt, so dass euer Posting bei einer Auflösung von 1024 Pixeln (Breite) ohne Hindernisse zu lesen ist.


Du bist also Informatiker? ;-)

Zitat:
Dein Code sprengt meine Auflösung von >1024.
Meine nicht (ebenfalls 1024 Pixel in der Waagerechten).
Woher soll ich wissen, wann deine Auflösung gesprengt wird?
Gibts die Angabe einer maximalen Zeichenzahl pro Zeile, oder kann ich die Überschreitung eines Zeilenbreiten-Limits irgendwie anders verifizieren?

--
[1] Reden wir uns heute mit Sie an?

Geändert von fireweasel (02-01-2009 um 13:22 Uhr)
Mit Zitat antworten
  #17 (permalink)  
Alt 02-01-2009, 13:17
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

80 Zeichen pro Zeile.
Mit Zitat antworten
  #18 (permalink)  
Alt 03-01-2009, 17:00
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von fireweasel
Du fragst 4 Bedingungen ab, die du über drei Zeilen verteilst, ich nur eine auf einer Zeile.
Ich denke, die Menge an Quelltext ist nicht entscheident (auch nicht die Geschwindigkeit), sondern die Übersichtlichkeit.
Dein Regex-Ungetüm ist mir jetzt schon zu unübersichtlich, geschweige denn, wenn Du es noch erweiterst.
Da ist ghostgamblers Code schon bedeutend einfacher nachzuvollziehen bzw. zu erweitern. Nach dem Grundsatz "Teile und herrsche".

Was nützt es mir, wenn ich alles in einen Regex gieße und nach drei Wochen, wenn ich die Stelle erweitern möchte erstmal eine halbe Stunde benötige mich da wieder reinzudenken?
Mit Zitat antworten
  #19 (permalink)  
Alt 04-01-2009, 04:54
Griecherus
 PHP Senior
Links : Onlinestatus : Griecherus ist offline
Registriert seit: May 2005
Ort: Berlin
Beiträge: 1.036
Griecherus ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ein "Ungetüm" ist das imho noch lange nicht. Darüber hinaus sollte die eingerückte und dokumentierte Darstellung selbstredend sein, so wie Code im Allgemeinen dokumentiert werden sollte, um auch nach längerer Zeit auf Anhieb nachvollziehbar zu sein. Dass die String-Funktionen leichter zu erweitern sind, halte ich für inkorrekt bis mindestens debattierbar.


Grüße
Mit Zitat antworten
  #20 (permalink)  
Alt 05-01-2009, 19:28
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Sooo, ich hab den RegEx nochmal überarbeitet und vereinfacht (oder verkürzt).
Nebenbei funktioniert er jetzt auch. Bei der alten Variante, hat die Verankerung am Ende gefehlt, so dass auch Strings mit mehr als einem Punkt als passend erkannt wurden.

Das Ganze wie oben in eigene Funktionen verpackt und die preg_match()-lose Variante zum Vergleich:
PHP-Code:
// Wichtig: man vergesse hierbei bitte nicht, 
// dass die Boardsoftware Backslashes schluckt ;-)
// Also Kopieren nur über die Zitat-Funktion.

function regex_3(
  
$txt
) {
  static 
$pcre '/\A(?=[^\.]*(?:\.[^\.]*)?\z)[a-z0-9_\.]{4,10}\z/';
  
// \A                # verankern am Anfang

  // (?=              # Lookahead-Assertion:
  // [^\.]*            # kein Punkt, keinmal oder beliebig oft

  // (?:              # diese Klammer nicht zwischenspeichern
  // \.[^\.]*           # ein Punkt, gefolgt von keinem 
                      # oder beliebig vielen Punkten
  // )?               # das Ganze ist optional                       
  // \z)               # bis zum Ende des Strings

  // [a-z0-9_\.]{4,10} # 4--10 Zeichen
  //                  # erlaubt: a--z, 0--9, _, .
  // \z                # Verankern am Ende
  
return (bool) preg_match($pcre$txt);
}

function 
strlen_strpos_strspn(
  
$txt
) {
  static 
$dot '.';
  return
      
strlen($txt) >= && strlen($txt) <= 10 &&
      
strpos($txt$dot) === strrpos($txt$dot) &&
      
strspn($txt'abcdefghijklmnopqrstuvwxyz1234567890_.');

Und das entsprechend geänderte Testskript:

PHP-Code:
$pcre '/\A(?=[^\.]*(?:\.[^\.]*)?\z)[a-z0-9_\.]{4,10}\z/';

// test:
$dot '.';
// laengen von 3 bis 10 Zeichen
for ($size 3$size <= 11; ++$size) {
  
$base_haystack str_repeat('0'$size);
  
// dot von position 0 bis letztmoegliche position
  // bei "position" -1 ohne punkt
  
for ($dot_pos = -2$dot_pos strlen($base_haystack); ++$dot_pos) {
    
$haystack $base_haystack;
    if (isset(
$haystack[$dot_pos])) {
      
$haystack[$dot_pos] = $dot;
    }
    elseif (
$dot_pos < -1) {
      
$haystack[0] = $dot;
      
$haystack[1] = $dot;
    }
    
$should_match = (
      
strlen($txt) >= && strlen($txt) <= 10 &&
      
strpos($txt$dot) === strrpos($txt$dot) &&
      
strspn($txt'abcdefghijklmnopqrstuvwxyz1234567890_.');
    ) ? 
0;

    
$has_match preg_match($pcre$haystack);
    
// fuer Testausgabe im Browser
    
printf(
        
'len(%s) %s passt? %d richtig? %d<br />'
        
strlen($haystack), 
        
$haystack
        
$has_match
        
$has_match === $should_match
    
);
  }

Zitat:
Ich denke, die Menge an Quelltext ist nicht entscheident (auch nicht die Geschwindigkeit), sondern die Übersichtlichkeit.
... und die Beherrschung der deutschen Rechtschreibung? ;-)
Nein, im Ernst: Natürlich ist ohne die genauere Kenntnis darüber, wie diese Prüfung eingesetzt werden soll, eine Diskussion über Geschwindigkeit oder Quelltextmenge eher theoretischer Natur. Ich habe so den vagen Verdacht, dass der OP lediglich die Angaben aus einem Web-Formular prüfen wollte. Dann wäre eine Optimierung auf Geschwindigkeit Zeitverschwendung. Aber auf größere Datenmengen angesetzt, kann ein Laufzeitunterschied von 30 Prozent schon einiges ausmachen. Und als (aller)letztes Wort dazu noch: Die Ausführungsgeschwindigkeit der PCRE-losen Variante hängt stark von der Reihenfolge der einzelnen Prüfschritte und der Beschaffenheit der zu prüfenden Zeichenkette ab.

Zitat:
Dein Regex-Ungetüm ist mir jetzt schon zu unübersichtlich, ... geschweige denn, wenn Du es noch erweiterst.
Hmmm, du hast anscheinend auch noch ein paar Semester Informatikstudium vor dir. ;-) Glaub mir einfach, du wirst irgendwann die Worte "Ungetüm", "unübersichtlich" und ähnliche nicht mehr im Zusammenhang mit so einem simplen PCRE verwenden.

Zitat:
... geschweige denn, wenn Du es noch erweiterst.
Nun die "Erweiterung" um Großbuchstaben, auf die ich mich bezog, ist mit einem kleinen "i" am Ende des PCRE abgefrühstickt. Ähnliches gilt für Unicode-Kompatibilität (zumindest für UTF-8).

Geändert von fireweasel (05-01-2009 um 19:39 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 07:52 Uhr.