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 Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #16 (permalink)  
Alt 25-10-2014, 18:21
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

Zitat:
Zitat von pippo Beitrag anzeigen
Spontan überlege ich, ob die RegExp in preg_match(), also ohne multibyte support, mitspielt vor allem mit den Umlauten:

PHP-Code:
preg_match('/\A(?>\pL\pM*|[\-._]){1,200}\z/u'$input); 
Prinzipiell kann die PCRE-Erweiterung (also alles, was mit preg_... anfängt), mit UTF-8 umgehen (dafür sorgt das "/u"). Die interne PCRE-Library kann zusätzlich UTF-32 und UTF-16. Nur hat man das derzeit in PHP noch nicht eingebaut. Das kommt aber sicher irgendwann. Andere Kodierungen kannst du zwar mit der MBString-Erweiterung abdecken, allerdings ist deren RegEx-Funktionalität und -Syntax etwas anders. Und ich weiß nicht, ob sie Tabellen für die Zeichenklassen \pL und \pM eingebaut hat. Die Dokumentation ist da etwas dürftig, wenn man kein Japanisch lesen kann.

Zitat:
Wenn preg_match() true zurückgibt, ist alles ok, und wenn nicht? Wie soll man da am besten reagieren, ich möchte dem User keinen Fehler zurückgeben, sondern der Dateiname soll sich automatisch anpassen.
Wenn du den benutzer-gegebenen Namen weiterverwenden willst, wirst du immer auf Fehler stoßen. Bspw. kann der Namen schon vergeben sein. Das kann der Regex nicht wissen, nur das Dateisystem.

Manchmal ist es einfacher einen eindeutigen Datei-Namen zu generieren und den vom Browser gelieferten irgendwo anders abzuspeichern, falls ihn irgendwer nochmal braucht.
Mit Zitat antworten
  #17 (permalink)  
Alt 26-10-2014, 11:10
pippo
 Registrierter Benutzer
Links : Onlinestatus : pippo ist offline
Registriert seit: Oct 2004
Ort: (CH) Tessin
Beiträge: 241
pippo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von fireweasel Beitrag anzeigen
Im Übrigen sind diverse Zeichen in Dateinamen sowieso verboten und diese sind abhängig vom unterliegenden Betriebssystem und Dateisystem. Du musst dich also zusätzlich auf Fehler einstellen, die auftreten, obwohl der Dateiname (d)eine Prüfung per RegEx überstanden hat.
Du hast Recht, nachdem eine Datei ($fileName) hochgeladen wird, muss sie noch durch mehrere Prozessen gehen, ExifTool (MetaTags auslesen), weitere Bildmanipulationen mit GraphicsMagick, Sips, ZIP erstellen usw...
Das ganze ist trotz RegExp-Check sehr fehleranfällig, darum habe ich mich entschieden, den Original-Dateinamen in einem extra Feld zu speichern und der Variable $fileName eine eindeutige Unique-Id zu verpassen.

Zitat:
Zitat von fireweasel Beitrag anzeigen
Prinzipiell kann die PCRE-Erweiterung (also alles, was mit preg_... anfängt), mit UTF-8 umgehen (dafür sorgt das "/u"). Die interne PCRE-Library kann zusätzlich UTF-32 und UTF-16. Nur hat man das derzeit in PHP noch nicht eingebaut...
Nur rein interessehalber, wie würde die negierte Variante deines vorherigen Beispiels mit preg_match() aussehen, wenn ich mit preg_replace() eine Art sanitized Behandlung anwenden möchte. Man sollte diese RegExp ('/\A(?>\pL\pM*|[\ .-])\z/u'), welche ja gut mit preg_match() funktioniert hat, umkehren. So werden die Sonderzeichen nicht gefiltert:

PHP-Code:
 $fileName preg_replace'/\^A(?>\pL\pM*|[\ _.-])\z/u''_'$fileName ); 
Mit Zitat antworten
  #18 (permalink)  
Alt 27-10-2014, 09:54
Benutzerbild von mermshaus mermshaus
 Registrierter Benutzer
Links : Onlinestatus : mermshaus ist offline
Registriert seit: Jun 2009
Beiträge: 451
mermshaus wird schon bald berühmt werden
Standard

Negatives Matching ist schwierig. (Soll heißen: schwierig für mich. )

Du kannst dir aber in diesem Fall recht problemlos (Speicher, Laufzeit) aus den positiven Treffern eine Maske konstruieren, die du dann noch mal auf den Ausgangsstring anwendest.

(Alles natürlich als UTF-8.)

PHP-Code:
<?php

function f($s)
{
    
$allowedCharactersPattern '/\pL\pM*|[\-._ ]/u';

    
$replacementChar '_';

    
$mask preg_replace_callback(
        
$allowedCharactersPattern,
        function (
$matches) use ($replacementChar) {
            return 
str_repeat($replacementCharstrlen($matches[0]));
        },
        
$s
    
);

    
// $mask enthält an dieser Stelle: "__________12*3_()_\r\n__"
    // Jede Position, an der sich ein Unterstrich/$replacementChar befindet,
    // markiert ein *erlaubtes* Byte in der Eingabe

    // Alle *unerlaubten* Bytes rauswerfen
    // (Indizes in der Eingabe, an denen in der Maske *kein*
    // replacementChar steht)

    
$len strlen($s);
    
$sanitized '';

    for (
$i 0$i $len$i++) {
        
$sanitized .= ($replacementChar === $mask[$i])
                ? 
$s[$i]
                : 
$replacementChar;
    }

    return 
$sanitized;
}

$input "\xC3\xA4 \x6F\xCC\x88 \xC3\xBC 12*3 ()-\r\n._";
       
// (ä NFC ) (  ö NFD   ) (ü NFC )

$tmp f($input);

var_dump(
    
$tmp,
    
bin2hex($tmp)
);
Ausgabe:

Code:
string(22) "ä ö ü ____ __-__._"
string(44) "c3a4206fcc8820c3bc205f5f5f5f205f5f2d5f5f2e5f"
Das "ö" ist NFD, "ä" und "ü" sind NFC. Ich weiß nicht, ob die Unterscheidung meine Shell/meinen Browser/die Forensoftware überlebt.

Die Längenbegrenzung bekommst du mit mb_substr($input, 0, 200, 'UTF-8'); hin. Du musst dabei aber bedenken, dass das keine 200 Bytes sind, sondern 200 UTF-8-Characters, die jeweils mehr als ein Byte belegen können. Wie lang 200 UTF-8-Characters in Byte maximal sein können, ist diskutabel.

Zitat:
Der Algorithmus lässt theoretisch bis zu acht Bytes lange Byteketten und dadurch über vier Billionen Zeichen zu. Die letzte Stufe enthielt als erstes Byte 11111111 und danach sieben Folge-Bytes mit jeweils sechs Nutz-Bits. Die gesamte Codefolge wäre dann 2(7*6) = 242 = 4.398.046.511.104 Zeichen). Real definiert wurde ursprünglich eine Folge aus einem ersten Byte mit bis zu 1111110x und somit fünf Folge-Bytes der Form 10xxxxxx, also zusammen sechs Byte mit insgesamt 31 Bit für den enthaltenen Unicode-Wert. In seiner Verwendung als UTF-Kodierung ist er aber auf den gemeinsamen Coderaum aller Unicode-Kodierungen beschränkt, also von 0 bis 0010 FFFF (1.114.112 Möglichkeiten) und weist maximal vier Bytes lange Byteketten auf.
- https://de.wikipedia.org/wiki/UTF-8

Es gibt Argumente für 4, 6 und 8 Byte pro Character, also 800, 1200 oder 1600 Byte insgesamt.

substr kannst du für so was übrigens vergessen, weil es die UTF-8-Characters zerhackt. Wenn du die Länge auf eine Anzahl an Bytes begrenzen möchtest, würde ich eine Schleife machen mit mb_substr, die so lange einen Character hinzufügt, bis die strlen (nicht die mb_strlen) des entstandenen Strings die gewünschte Länge überschreitet. Dann wieder einen Character abziehen – fertig.

Fun fact:

PHP-Code:
$input 'u' str_repeat("\xCC\x88"300);
        
// "u" + <U+0308 COMBINING DIAERESIS> (300-mal)

var_dump(mb_substr($input0200'UTF-8'));
        
// string(399) "ü" (je nach Software wird das nicht unbedingt ein "ü")
        //                 (Und hier im Code ist das ein NFC-"ü", keine Angst) 

Geändert von mermshaus (27-10-2014 um 09:58 Uhr)
Mit Zitat antworten
  #19 (permalink)  
Alt 27-10-2014, 16:53
pippo
 Registrierter Benutzer
Links : Onlinestatus : pippo ist offline
Registriert seit: Oct 2004
Ort: (CH) Tessin
Beiträge: 241
pippo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Hallo mermshaus,

ich habe mehreren Tests laufen lassen, es scheint wirklich gut zu funktionieren.

Jetzt fehlt nur noch dass die Funktion in die PHP-Bibliothek hinzugefügt wird ;-)
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wie kann ich ein Quellcodebeispiel ausgeben, so das es nicht verarbeitet wird? BananaJo PHP Developer Forum 3 11-01-2009 20:16
[Funktion] Verweise als Parameter + Variable Parameterzahl Maranello-550 PHP Developer Forum 2 28-06-2005 11:25
header(), Variable wird nicht richtig dargestellt deti PHP Developer Forum 5 09-07-2004 11:21
Parameter wird nicht übergeben aban PHP Developer Forum 8 17-01-2004 11:58
PHP wird nicht richtig verarbeitet garrie Fragen zu Installation & Konfiguration (LAMP, WAMP & Co.) 0 04-08-2003 20:47

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 19:55 Uhr.