[PHP] array maken met values binnen een string

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Ik heb een string met die er zo uit kan zien:

code:
1
2
3
4
<form action="go.php?id=1"
method="POST"><input type="hidden"
name="amount" value="12" /> 
<input type="hidden" name="08" value="12">


Nu wil ik graag alle waardes die binnen " staan in een array hebben.

Explode is niet echt een oplossing want dan hou je ook de stukken over waar het niet instaat. Verder heb ik een hele tijd zitten searchen ook op php.net. Maar ik kom er echt niet meer uit.

Volgens mij moet het niet zo moeilijk zijn, ik heb bij preg_split in de phpmanual gekeken, maar volgens mij moet ik dat toch ook niet hebben :?

[ Voor 26% gewijzigd door me1299 op 23-04-2003 20:02 . Reden: spelling geonctroleerd :o ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
gewoon de string van links naar rechts doorlopen. met strpos zoek je de eerste " en onthoudt de offset. Je zit nu aan het begin van de quoted string. Nu zoek je de volgende " en je hebt de eerste waarde tussen quotes. Dit doe je net zo lang totdat je de hele string processed heb. De truuk is de offset in een string.

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Ik heb al iets geloof ik :o

PHP:
1
preg_match("/\"(.*)\"/si", $form_to_strip, $form_values);

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

DeathKnight schreef op 23 april 2003 @ 20:14:
Ik heb al iets geloof ik :o

PHP:
1
preg_match("/\"(.*)\"/si", $form_to_strip, $form_values);
:P

* Tux had net een ingewikkelde char-for-char checker zitten maken :P

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

$string = "Dit is \"een\" voorbeeldstring. Hij \"is wel wat\" kort";
$output = Array ();

for ($i = 0; $i < strlen ($string); $i++)
{
    if ($string[$i] == "\"" && $inquotes == false)
    {
        $inquotes = true;
    }
    elseif ($string[$i] == "\"" && $inquotes == true)
    {
        $inquotes = false;
        $output[] = $temp;
        $temp = "";
    }
    elseif ($inquotes == true)
    {
        $temp .= $string[$i];
    }
}

echo $string . "<br />";

echo "<pre>";
print_r ($output);
echo "</pre>";

?>

[ Voor 27% gewijzigd door Tux op 23-04-2003 20:17 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Tux schreef op 23 april 2003 @ 20:16:
[...]


:P

* Tux had net een ingewikkelde char-for-char checker zitten maken :P

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php

$string = "Dit is \"een\" voorbeeldstring. Hij \"is wel wat\" kort";
$output = Array ();

for ($i = 0; $i < strlen ($string); $i++)
{
    if ($string[$i] == "\"" && $inquotes == false)
    {
        $inquotes = true;
    }
    elseif ($string[$i] == "\"" && $inquotes == true)
    {
        $inquotes = false;
        $output[] = $temp;
        $temp = "";
    }
    elseif ($inquotes == true)
    {
        $temp .= $string[$i];
    }
}

echo $string . "<br />";

echo "<pre>";
print_r ($output);
echo "</pre>";

?>
Sorry voor al het werk 8)7.

Maar ik blijf toch bij mijn iets compactere notatie ;)

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
DeathKnight schreef op 23 april 2003 @ 20:24:
[...]


Sorry voor al het werk 8)7.

Maar ik blijf toch bij mijn iets compactere notatie ;)
Hoe wil je met jou korte notitatie de quoted strings 2 .. n uit een string vissen?

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Hmm ik kom zou juist tot de ontdekking dat mijn gevonden functie maar een array geeft met 1 element met alle zooi aan elkaar.

Dus Tux, ik zal eens ff naar jou productie kijken ;)

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Grum
  • Registratie: Juni 2001
  • Niet online
Split/preg_split en dan alle oneven elementen pakken ? :) (in html kan je toch de " niet escapen)

Ow .. ik programmeer niet meer :P

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
stekkel schreef op 23 April 2003 @ 20:26:
[...]


Hoe wil je met jou korte notitatie de quoted strings 2 .. n uit een string vissen?
Daarvoor hebben ze preg_match_all uitgevonden :P

.

Acties:
  • 0 Henk 'm!

  • me1299
  • Registratie: Maart 2000
  • Laatst online: 15:23

me1299

$ondertitel

Topicstarter
Zo nou Tux z'n progsel bleek hier niet echt te werken. Dus ik ben zelf maar aan het coden geslagen. Nu werkt het allemaal.

Mocht iemand het nog eens handig vinden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$quotes_position = array();

for($count = 0; $count <= strlen($form_to_strip); $count++) {
    if(substr($form_to_strip, $count, 1) == "\"") {
        $quotes_position[] = $count;            
    }
}

$arrayFormValues = array();     

$commas_count = -1;

for($count = 0; $count <= (count($quotes_position) / 2) -1; $count++) {

    $s = $commas_count + 1;
    $l = $commas_count + 2;

    $start = $quotes_position[$s] +1;
    $length = $quotes_position[$l] - $start;
    
    $arrayFormValues[] = substr($form_to_strip, $start, $length);

    $commas_count++; $commas_count++;
}

print_r($arrayFormValues);


Het kan ongetwijfeld compacter, maar ik vind dat ik hier onderhand wel lang genoeg over gedaan heb.

[ Voor 24% gewijzigd door me1299 op 23-04-2003 21:56 ]

Het maakt eigenlijk niet uit wat je bewuste geest doet, omdat je onderbewuste automatisch precies dat doet wat het moet doen


Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

DeathKnight schreef op 23 April 2003 @ 21:50:
Zo nou Tux z'n progsel bleek hier niet echt te werken. Dus ik ben zelf maar aan het coden geslagen. Nu werkt het allemaal.

Mocht iemand het nog eens handig vinden:
Het kan ongetwijfeld compacter, maar ik vind dat ik hier onderhand wel lang genoeg over gedaan heb.
Raar want hier werkte die perfect met het testscriptje wat ik gegeven heb.

Zal wel een verschil in PHP versie zijn ofzow :P
Dit is "een" voorbeeldstring. Hij "is wel wat" kort

Array
(
[0] => een
[1] => is wel wat
)
Kreeg ik als output. Jij dan niet uit dat voorbeeldscript?

[ Voor 17% gewijzigd door Tux op 23-04-2003 23:52 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • Glabbeek
  • Registratie: Februari 2001
  • Laatst online: 07:52

Glabbeek

Dat dus.

Ik heb ook even zitten puzzelen, en het kan inderdaad korter:

PHP:
1
2
3
4
5
6
7
<?php
  $result = explode("\"" , "*" . $queryString);
  for ($i=0 ; $i < (count($result)) ; $i++) {
    array_splice($result , $i , 1);
  }
  print_r($result);
?>


Wat dit doet is het volgende:
• Het zet een ster voor de string om ervoor te zorgen dat het eerste karakter geen aanhalingsteken is.
• Het explode de string op aanhalingstekens. Door het toevoegen van het sterretje weet ik zeker dat het eerste element van de gecreëerde array geen stuk is dat we willen hebben. Alle gedeeltes die tussen aanhalingstekens stonden staan nu in de oneven elementen van de array, dus: $result[1], $result[3], $result[5], enz.
• Dat wetende, loop ik de array door en haal ik alle even elementen eruit. Om dit te illustreren een voorbeeld:

Hierbij staat elke 0 voor een element dat niet nodig is en elke 1 voor een element dat wel nodig is:
code:
1
2
3
4
Start: 010101
Na 1e loop (element 0 wordt weggehaald): 10101
Na 2e loop (element 1 wordt weggehaald): 1101
Na 3e loop (element 2 wordt weggehaald): 111


Uiteindelijk blijft dus een array over met de stukken die in de originele string tussen aanhalingstekens stonden.

Zo, nu ga ik maar eens slapen :z

En zo is het maar net.


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
5
6
7
8
$tekst='<form action="go.php?id=1"
method="POST"><input type="hidden"
name="amount" value="12" /> 
<input type="hidden" name="08" value="12">';


preg_match_all("/=\"(.*)\"/U",$tekst,$results);
print_r($results[1]);


Ik ben er hierbij vanuit gegaan dat alle 'values' voorafgegaan worden door een = teken, maar dat kun je eventueel weghalen uit de regexp als dat niet de bedoeling was.. :)

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$tekst='<form action="go.php?id=1" 
method="POST"><input type="hidden" 
name="amount" value="12" />     
<input type="hidden" name="08" value="12">';

function startElement($parser, $name, $attribs) {
    foreach($attribs as $k => $v) echo '<li>'.$k.' -&gt;'.$v.'</li>';
}

function endElement() {}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_parse($xml_parser, $tekst);
Pagina: 1