phpbar.de logo

Mailinglisten-Archive

[php] Regex Problem (OT)

[php] Regex Problem (OT)

Sebastian Mendel lists at sebastianmendel.de
Don Mar 11 15:43:46 CET 2004


Roland Braband wrote:

>>oder du splittest es einfach an den Kommastellen und übprüfst dann jedes
>>einzelne:
>>für jede zeile
>>{
>>  split bei komma
>>  überpfüfen jedes feldes (is_string, is_int, ...)
>>}
> 
> 
> Das ist der richtige Ansatz und auch die Richtung die ich weiter verfolge.
> Aber ein einfaches aufsplitten mit split() führt nicht zum Ergebnis, da:
> 
> INT, INT, STRING, INT, STRING
> 1    , 2     , 'test'       , 3     ,'$richtig->essen(\'fettarmes\',
> \'essen\', true)'    => true
> 
> einen String enthält der selbst Kommata beinhaltet!
> Also muss ich über preg_split() einen Term finden
> der das nach folgenden Regeln splittet:
> 
> (NACH ,) ODER (, UND vorheriges (' OHNE vorheriges\))
> 
> sebst dann ist nicht sicher ob nicht:
> 
> 1    , 2     , 'test'       , 3     ,'$richtig->essen(\'fettarmes\',
> \'essen', true)'    => true
>                                             slash bevor singel Quote
> fehlt ---^
> eine exeption schmeisst was nicht sein soll ich will ja genau diesen Fall
> filtern
> und 'reparieren'!
> Also sollte die Regel heissen:
> 
> (NACH ' OHNE vorherigen \) UND ,
> 
> was aber nicht den ersten Abschnitt matcht :(
> 
> Anderer Lösungsweg:
> ein:  $regs = "/'([^'].*)'/sim";
> preg_match_all($regs, $string, $match);
> gibt mir den gesuchten String als Kommataseparierte Liste zurück,
> ein: $regs = "/'([^'].*?)'/sim";
> splittet sogar diese liste nach Kommata, erfüllt aber nicht die Bedingung
> das Php-Code
> erhalten bleiben soll! Ich drehe mich also im Kreis...

// flags
$string_open = true;
$value_type = 'undefined';
$escaped = false;

$numbers = array(0,1,2,3,4,5,6,7,8,9);

for ( $i = 0; $i <= strlen($values); $i++ )
{
   switch ( $value_type )
   {
     case 'int':
       if ( in_array($values[$i], $numbers) )
       {
         $value_type = 'int';
       }
       elseif ( $values[$i] == ',' && $values[$i] != ' ' )
       {
         $value_type = 'undefined';
       }
       elseif ( $values[$i] != ' ' )
       {
         // ERROR!
       }
       break;
     case 'string':
       if ( $values[$i] == "'"
         && $string_open == true
         && $escaped == false)
       {
         $string_open = false;
       }
       elseif ( $values[$i] == '\\'  )
       {
         if ( $escaped == true )
           $escaped = false;
         else
           $escaped = true;
       }
       elseif ( $string_open == false && $values[$i] == ',' )
       {
         $value_type = 'undefined';
       }
       break;
     case 'undefined':
     default:
       if ( in_array($values[$i], $numbers) )
       {
         $value_type = 'int';
       }
       elseif ( $values[$i] == "'" )
       {
         $value_type = 'string';
         $string_open = true;
       }
   }
}

if ( $string_open == true )
{
   // ERROR!
}


ich hab das jetzt nicht getestet, sondern bloß mal so ausm kopf hier hin 
geschrieben, so als denk-anstoß!


-- 
Sebastian Mendel (www.sebastianmendel.de)

*www.warzonez.de* | www.tekkno4u.de | www.nofetish.com

php::bar PHP Wiki   -   Listenarchive