Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > PHP > PHP-Programmierung > Hex-Farbcode validieren
Antwort
 
Themen-Optionen
Alt 09.12.2005, 17:04   Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Hex-Farbcode validieren

Hallo,
bin gerade an den Überlegungen für eine Funktion zur Hex-Farbcode Validierung. Es gibt ja verschiedene Formen:
#fff, #ff0000, fff, ff0000, &Hff0000 usw..
Nun würde es mich mal interessieren, wie lassen sich Hex-Farbcodes noch schreiben (evtl mit 0x..) und wie kann ich prüfen ob der eingegebene Hexwert auch korrekt ist? Reicht es, einfach das Ganze nach RGB umzuwandeln und dann auf < 0 und > 255 zu prüfen?
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 17:08   Nach oben    #2
Mensch
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.710
Standard

Die Frage ist schonmal: für welchen Bitbereich du validieren möchtest.
Und es gibt laut www.css4you.de auch farben, die nicht sauber dargestellt werden, deswegen gibt es dort die liste der "websicheren" Farben.

Willst du die validieren was in einem Formular eingegeben wird? Wenn ja dann würd ich einfach #rrggbb als vorgabe machen und fertig
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 17:12   Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Also vorgegeben ist #rrggbb .. #000000 Minimum, #ffffff Maximum, eben die Farbpalette einmal komplett durch. Problem ist ja, dass der User diese Farbe eingibt und es geprüft werden soll, ob das ein gültiger Farbwert oder nicht ist. Ob das Ding sauber dargestellt wird oder nicht ist egal - eine Funktion zum Websichere-Farben konvertieren hab ich schon geschrieben (es geht ) ..

Ziel ist nur, den Code zu validieren. Daher wollte ich Fragen was es noch alles an Varianten gibt, einen HexFarbcode zu schrebien, damit ich diese in meinen Regex einbauen und auswerten kann. (fff, #fff, #ffffff, &Hfff, &Hffffff ...)
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 17:54   Nach oben    #4
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Zitat:
&Hff0000
hmmm, noch nie gesehen, jedenfalls nicht bei HTML.
Und dann gibt es ja noch black, red ... silver ... eine ellenlange Liste
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:07   Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von CIX88
Zitat:
&Hff0000
hmmm, noch nie gesehen, jedenfalls nicht bei HTML.
Und dann gibt es ja noch black, red ... silver ... eine ellenlange Liste
&H hatt ich schonmal irgendwo gelesen.
Nuja, an diese Namen-Farben hatt ich noch nicht geadacht ..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:10   Nach oben    #6
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

Zitat:
Zitat von CIX88
black, red ... silver ... eine ellenlange Liste
Es geht ja um die Hex-Codes
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:11   Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von Lars
Zitat:
Zitat von CIX88
black, red ... silver ... eine ellenlange Liste
Es geht ja um die Hex-Codes
.. welche ich ohne Probleme ja validieren kann. Wollte mich nur mal schlau machen, was alles so möglich ist außer 3 und 6 stelligen Hex mit und ohne # ..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:15   Nach oben    #8
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

naja rgb( 20%, 40%, 10%) oder sowas gibt es auch noch ...
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:18   Nach oben    #9
me pro ok?
 
Benutzerbild von Lars
 
Registriert seit: 07.09.2005
Ort: Pulheim bei Köln
Beiträge: 964
Standard

rgb(255, 0, 255) meinst du denk ich. Enspricht #FF00FF. Muss man dann ja nurnoch umrechnen :>
__________________
Gedanken aus Draht stricken einen Zaun.
Lars ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:31   Nach oben    #10
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

nönö, meinte schon Angaben mit Prozent ...
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:32   Nach oben    #11
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

rgb(%, %, %) gibt es eben so.. danke cix88 hatt ich vergessen
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 18:44   Nach oben    #12
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

und dann den regexp bitte in einer Zeile
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:01   Nach oben    #13
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Mein erster Ansatz ist dieser:
Code:
((?:#)?(([a-f0-9]{6})|([a-f0-9]{3}))|(rgb\([0-9]{1,3},[0-9]{1,3},[0-9]{1,3}\)))
..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:06   Nach oben    #14
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Hab auch mal gebastelt:

Zitat:
'~^#?([0-9a-f]{3}|[0-9a-f]{6})$~i'
'~^rgb\s*\(\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*\)$~i'
Allerdings reicht das hinten und vorne nicht.
Hinzu müsste man dann noch überprüfen, ob Prozentangaben von 0-100 gehen, und die anderen von 0-255.
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:15   Nach oben    #15
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Zitat:
Zitat von CIX88
Hab auch mal gebastelt:

Zitat:
'~^#?([0-9a-f]{3}|[0-9a-f]{6})$~i'
'~^rgb\s*\(\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*\)$~i'
Allerdings reicht das hinten und vorne nicht.
Aye Leerzeichen hab ich ja ganz vergessen..
Zitat:
Zitat von CIX88
Hinzu müsste man dann noch überprüfen, ob Prozentangaben von 0-100 gehen, und die anderen von 0-255.
Mhm.. vielleicht etwas in der Art wie
Code:
(1?[0-9]?[0-9]\%)
und
([0-2]?[0-5]?[0-5])
Wobei 199% dann auch mögilch wäre.. Wie war das noch gleich mit den Lookback-Konditionen? Und gibts da schon lookforward? Und bei letzterm [0-5] .. wäre ja dann z.b. 99 nicht möglich..
__________________
http://www.ChrisDiary.De

Geändert von Chr!s (09.12.2005 um 19:19 Uhr).
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:21   Nach oben    #16
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Zitat:
Mhm.. vielleicht etwas in der Art wie
Jo war auch mein erster Gedanke, aber das wird zu umständlich.
Bei einer Zeitabfrage geht das noch.
Hier wird ich danch noch testen ob die Zahl > 0 und < 255 etc. ist.

Vor langerweile hab ich noch etwas gefummelt (liebe regexp

PHP-Code:
$TXT = <<<EOD

Farbangaben:
rgb ( 20% , 40%, 10% )
rgb ( 220 , 40, 10 )
f99 #ff0 #004521 336699

EOD;

$pattern '~(
   #?([0-9a-f]{3}\b|[0-9a-f]{6}\b)|
   rgb\s*\(\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*\)
   )~ix'
;

preg_match_all($pattern$TXT$array);

echo 
'<pre>'print_r($arraytrue), '</pre>'
... so zum rumbasteln ...
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:24   Nach oben    #17
Erfahrener Benutzer
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Danke
Damit werd ich sicher mein Problem lösen
Falls noch was einfällt - ich hab keine Einwände dagegen
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 19:28   Nach oben    #18
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Eben kommt mir noch der Gedanke mit preg_replace_callback() müsste man auch was machen können.
Nun es soll zwar nicht ersetzt werden, aber die Suche nach dem Ausdruck bleibt ja das selbe Prinzip.
Dann könnte man noch eine Funktion einbauen, die z.B. speziell bei rgb(..) die Inhalte prüft.

... nur so ein Gedanke ...
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 09.12.2005, 21:04   Nach oben    #19
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Hmmm, hätte ich blos nie diese Thread gelesen, dann hätte ich diesen Mist nie gemacht
Zum nächsten basteln:

PHP-Code:
<?
error_reporting(E_ALL);

    function bereich_dez ( $zahl ) {
        $zahl = trim($zahl);
        if ( $zahl >= 0 && $zahl <= 255 )
            return 1;
            else
            return 0;
        }

    function bereich_pro ( $zahl ) {
        $zahl = trim($zahl);
        if ( $zahl >= 0 && $zahl <= 100 )
            return 1;
            else
            return 0;
        }

    function ValideColor ( $string ) {
        $string = trim($string);
        $err = '';

        $patt_1 = '~^#?([0-9a-f]{3}\b|[0-9a-f]{6}\b)$~i';
        $patt_2 = '~^rgb\s*\(\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*,\s*([0-9]{1,3}%?)\s*\)$~i';

        if ( preg_match( $patt_1, $string) ) {
            $out = 'gültiges Format';

        } elseif ( preg_match( $patt_2, $string, $test) ) {
            $out = 'gültiges Format';

            if ( substr($test[1], -1, 1) == '%' ) {
                 if ( bereich_pro($test[1]) == 0 ) $err .= ' Fehler bei der %-Angabe RED ...<br />'; 
                 } else {
                 if ( bereich_dez($test[1]) == 0 ) $err .= ' Fehler bei der RGB-Angabe RED ...<br />'; 
                 }
            if ( substr($test[2], -1, 1) == '%' ) {
                 if ( bereich_pro($test[2]) == 0 ) $err .= ' Fehler bei der %-Angabe GREEN ...<br />'; 
                 } else {
                 if ( bereich_dez($test[2]) == 0 ) $err .= ' Fehler bei der RGB-Angabe GREEN ...<br />'; 
                 }
            if ( substr($test[3], -1, 1) == '%' ) {
                 if ( bereich_pro($test[3]) == 0 ) $err .= ' Fehler bei der %-Angabe BLUE ...<br />'; 
                 } else {
                 if ( bereich_dez($test[3]) == 0 ) $err .= ' Fehler bei der RGB-Angabe BLUE ...<br />'; 
                 }

        } else {
        $out = 'ungültiges Format';
        }

    if ( $err != '') { $out = 'ungültiges Format<ul>'.$err.'</ul>'; }

    return '<b>Teste '.$string.'</b> : '.$out;
    }

 echo ValideColor( '#fff' ).' <br />';
 echo ValideColor( '#336699' ).' <br />';
 echo ValideColor( 'rgb ( 20% , 40%, 10% )' ).' <br />';
 echo ValideColor( 'rgb ( 55 , 10, 20 )' ).' <br />';

 echo ValideColor( '#fff5' ).' <br />';
 echo ValideColor( '#33669' ).' <br />';
 echo ValideColor( 'rgb ( 120% , 40%, 210% )' ).' <br />';
 echo ValideColor( 'rgb ( 55 , 310, 20 )' ).' <br />';

 echo ValideColor( 'rgb ( 130% , 310, 200% )' ).' <br />';

 echo ValideColor( 'rgb ( 20% , 10, 20 )' ).' <br />';

?>
EDIT:

Die Ausgabe sieht dann etwa so aus:

http://www.cix88.de/cix_php/php_rege...lide_color.php

Geändert von CIX88 (09.12.2005 um 21:16 Uhr).
CIX88 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 10.12.2005, 11:32   Nach oben    #20
Erfahrener Benutzer
 
Registriert seit: 18.03.2005
Beiträge: 588
Standard

Moin,

die Geschichte mit rgb( r, g, b) habe ich mal näher (mit IE und FF) durchprobiert.
Dabei vielen mit unterschiedliche Ergebnisse zwischen IE und FF auf.

1.
Zwischen rgb und ( darf sich kein Leerzeichen befinden.
IE und FF werten dies nicht aus.

2.
rgb( 100%, 0, 0)
Und hier kommt der nette Teil
Der IE werdet dies aus, der FF hingegen nicht.
Der FF will alle RGB-Angaben in Prozent oder als RGB-Wert haben, dem IE scheint es dabei egal zu sein.

Naja, daraus ergäbe sich:

// pattern: #fff oder #ffffff
$patt_1 = '~^#?([0-9a-f]{3}\b|[0-9a-f]{6}\b)$~i';

// pattern: rgb( 100%, 100%, 100%) - Angaben in Prozent
$patt_2 = '~^rgb\(\s*([0-9]{1,3}%)\s*,\s*([0-9]{1,3}%)\s*,\s*([0-9]{1,3}%)\s*\)$~i';

// pattern: rgb( 100, 100, 100) - Angaben in RGB-Wert
$patt_3 = '~^rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)$~i';

Auch Angaben wie rgb( 100 %, 0, 0) sind dann fehlerhaft, weill zwischen 100 und % ein Leerezeichen ist.

Weil grad Wochende ist, habe ich das mal so gemacht:

PHP-Code:
<?
error_reporting(E_ALL);

    /* Nicht schön, aber selten :-) */

    function bereich_dez ( $zahl ) {
        $zahl = trim($zahl);
        if ( $zahl >= 0 && $zahl <= 255 )
            return 1;
            else
            return 0;
        }

    function bereich_pro ( $zahl ) {
        $zahl = trim($zahl);
        if ( $zahl >= 0 && $zahl <= 100 )
            return 1;
            else
            return 0;
        }

    function ValideColor ( $string ) {
        $string = trim($string);
        $err = '';

        // pattern: #fff oder #ffffff
        $patt_1 = '~^#?([0-9a-f]{3}\b|[0-9a-f]{6}\b)$~i';

        // pattern: rgb ( 100%, 100%, 100%) - Angaben in Prozent
        $patt_2 = '~^rgb\(\s*([0-9]{1,3}%)\s*,\s*([0-9]{1,3}%)\s*,\s*([0-9]{1,3}%)\s*\)$~i';

        // pattern: rgb ( 100, 100, 100) - Angaben in RGB-Wert
        $patt_3 = '~^rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)$~i';

        if ( preg_match( $patt_1, $string) ) {
            $out = 'gültiges Format';

        } elseif ( preg_match( $patt_2, $string, $test) ) {
            $out = 'gültiges Format';
            if ( bereich_pro($test[1]) == 0 ) $err .= ' Fehler bei der %-Angabe RED ('.$test[1].') ...<br />'; 
            if ( bereich_pro($test[2]) == 0 ) $err .= ' Fehler bei der %-Angabe GREEN ('.$test[2].') ...<br />'; 
            if ( bereich_pro($test[3]) == 0 ) $err .= ' Fehler bei der %-Angabe BLUE ('.$test[3].') ...<br />'; 

        } elseif ( preg_match( $patt_3, $string, $test) ) {
            $out = 'gültiges Format';
            if ( bereich_dez($test[1]) == 0 ) $err .= ' Fehler bei der RGB-Angabe RED ('.$test[1].') ...<br />'; 
            if ( bereich_dez($test[2]) == 0 ) $err .= ' Fehler bei der RGB-Angabe GREEN ('.$test[2].') ...<br />'; 
            if ( bereich_dez($test[3]) == 0 ) $err .= ' Fehler bei der RGB-Angabe BLUE ('.$test[3].') ...<br />'; 

        } else {
        $out = 'ungültiges Format <ul> falsche Syntax </ul>';
        }

    if ( $err != '') { $out = 'ungültiges Format<ul>'.$err.'</ul>'; }

    return 'Teste <b>'.$string.'</b> : '.$out;
    }


 echo ValideColor( '#fff' ).' <br />';
 echo ValideColor( '336699' ).' <br />';
 echo ValideColor( 'rgb( 20% , 40%, 10% )' ).' <br />';
 echo ValideColor( 'rgb( 55 , 10, 20 )' ).' <br />';