Mailinglisten-Archive |
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