Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Parsowanie stringu
Forum PHP.pl > Forum > Przedszkole
desavil
Witam,

W jaki sposób mogę parsować takie coś?:
  1. [("key","val"), ("key2","val2"), ("key3","val3")]

Wpisując "key" chcę uzyskiwać daną wartość przypisaną do niego.
Zaznaczam, że nie jest to JSON, a kolejność może być różna.

Dzięki!
trueblue
  1. $string = '[("key","val"), ("key2","val2"), ("key3","val3")]';
  2. $trans = array("(" => "{", ")" => "}", "\",\"" => "\":\"");
  3. $string = strtr($string , $trans);
  4. print_r(json_decode($string ));
desavil
Wszystko fajnie, tylko jak ktoś w wartości będzie miał, np. nawias to zamieni mu go na nawias klamrowy.
Nie dałoby się zrobić tego jakoś regexem?
trueblue
Można.

A tak?
$trans = array("[(" => "[{", ")]" => "}]", "\"), (\"" => "\":\"", "\"), (\"" => "\"}, {\"");
daro0
A to?

  1. $subject = '[ ( "key" , "val" ), ("key2","[]{}()val2" ), ("key3","val3")]';
  2.  
  3. $patterns = array(
  4. '/\([\s]*"/',
  5. '/"[\s]*\)/',
  6. '/"[\s]*,/',
  7. );
  8. $replace = array(
  9. '{"',
  10. '"}',
  11. '":',
  12. );
  13.  
  14. $json = preg_replace($patterns, $replace, $subject);
  15. var_dump($subject, $json, json_decode($json));


wynik:

  1. string(69) "[ ( "key" , "val" ), ("key2","[]{}()val2" ), ("key3","val3")]"
  2. string(58) "[ {"key": "val"}, {"key2":"[]{}()val2"}, {"key3":"val3"}]"
  3. array(3) {
  4. [0]=>
  5. object(stdClass)#1 (1) {
  6. ["key"]=>
  7. string(3) "val"
  8. }
  9. [1]=>
  10. object(stdClass)#2 (1) {
  11. ["key2"]=>
  12. string(10) "[]{}()val2"
  13. }
  14. [2]=>
  15. object(stdClass)#3 (1) {
  16. ["key3"]=>
  17. string(4) "val3"
  18. }
  19. }
  20.  
desavil
Wygląda znacznie lepiej, ale tutaj znów nie mogę użyć znaku " w wartości. sad.gif
trueblue
https://regex101.com/r/3mrNRx/1
daro0
To się daje \" w tym ciągu znaków
  1. $subject = '[("key", "val"), ("key2","\"val2" ), ("key3","val3")]';


Zakładam że format wejściowy który chcesz parsować jest ustalony wg. pewnych reguł.

I jeszcze to:

  1. $subject = array
  2. (
  3. 'key1' => 'value1"'
  4. );
  5.  
  6. $json = json_encode($subject, JSON_PRETTY_PRINT);
  7. var_dump($json);


wynik:

  1. string(26) "{
  2. "key1": "value1\""
  3. }"


desavil
Niestety na format wejściowy nie mam żadnego wpływu. sad.gif Jakbym miał to nie byłoby tego całego tematu, bo bym od razu puścił w JSON albo innym XML.
O ile sama struktura jest stała, tak wartości argumentów mogą być dowolne.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.