Marc Reichelt: Endergebnis & Danke

Beitrag lesen

Hallo Alexander,

Das Stückchen Code sieht für mich fürchterlich ineffizient aus.

Er ist nicht sonderlich effizient, das stimmt - aber diese Funktion wird in meinem Projekt nicht so häufig aufgerufen, da kosten andere Dinge wesentlich mehr Laufzeit.
Nichtsdestotrotz kann - und sollte man - hier noch nachbessern. Dies kann ja im Verlauf der nächsten Tage geschehen, solange der Thread noch nicht archiviert ist.

  1. Die Prüfung auf den Punkt am Ende würde ich vor die Schleife ziehen, das spart für jedes einzelne Zeichen in $str einen Aufruf von strlen.

if ($str[strlen($str)-1]=='.') {
  return false; // Alternativ: $str um ein Zeichen verkürzen, denn der Punkt ist KORREKT, nur ungewöhnlich
}

  
Jepp, hier sollte man nur aufpassen dass $str auch wirklich eine Länge > 0 hat.  
  

> Kann PHP das nicht einfacher? Perl kann direkt auf das letzte Zeichen zugreifen, ohne strlen zu bemühen:  
>   
> ~~~perl
  

> if (substr($str,-1) eq '.') {  
>   return;  
>   # oder:  
>   substr($str,-1)='';  
> }  
> # oder gleich per RE:  
> $str=~s/\.$//;  
> 

Bei PHP geht's ziemlich ähnlich, kann man also auch abändern.

  1. Ich würde nicht jedes einzelne Zeichen in einer interpretierten Schleife darauf hin untersuchen, ob es legal oder illegal ist. Vor allem würde ich es mir verkneifen, für jedes einzelne Zeichen in $str nochmal strpos() aufzurufen, das eine weitere Schleife darstellt.

Die Schleife mit strpos() ermittelt für jedes Zeichen $needle, ob es im illegalen Satz $haystack auftaucht. Das ist soweit ok - natürlich kann man hier ebenfalls tunen, aber es wird dem Aufwand bei mir nicht gerecht.

Zu den regulären Ausdrücken: Sicher kann man das alles mit einem Ausdruck lösen, aber den versteht man später nicht mehr so leicht.

Whitelist-Version in Perl, mit etwas weniger erlaubten Zeichen (aus Tippfaulheit):

Funktioniert mit Bytes und Characters.

unless ($str=~/[1]+$/) {
  # Explizit erlaubt:
  # * @ -- weil die gesamte Adresse gematcht wird
  # * Ziffern, Buchstaben, und ausgesuchte Sonderzeichen (Minus muß aus technischen Gründen ganz hinten stehen)
  # Der gesamte String muß aus diesen Zeichen bestehen. Die RE-Engine bricht beim ersten Mismatch ab, der Code rennt ins return.
  return;
}


>   
> Ich würde die Whitelist-Version vorziehen, weil Du dann 100% garantieren kannst, welche Zeichen an die nicht escapende mail()-Funktion gehen.  
  
Eine solche Whitelist hatte ich bislang verwendet - die mochte Vinzenz aber nicht. ;)  
  
  
Grüße  
  
Marc Reichelt || <http://www.marcreichelt.de/>  

-- 
DPRINTK("Last time you were disconnected, how about now?");  
        linux-2.6.6/drivers/net/tokenring/ibmtr.c  
  
[Selfcode](http://emmanuel.dammerer.at/selfcode.html): ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)

  1. @0-9A-Za-z._- ↩︎