Wyrażenie regularne i preg_match_all

Wyrażenie regularne i preg_match_all
CA
  • Rejestracja:ponad 6 lat
  • Ostatnio:8 miesięcy
  • Postów:60
0

Witajcie, proszę o pomoc w wyrażeniem regularnym, mam następujące dane:

Kopiuj
111 {data v1="s1" v2="s2" v3="s3"} 222

I chciałbym wyciągnąć dane do tablicy żeby uzyskać:

Kopiuj
v1=s1;
v2=s2;
v3=s3;

niezależnie od tego jak wiele będzie parametrów.

Mam takie wyrażenie:

{data ((.*?)="(.*?)"){1,}}

Ale niestety nie działa ono u mnie poprawnie - tj. łapie całość { do } ale nie grupuje tego odpowiednio w tablicy.

Proszę o pomoc z ułożeniem odpowiedniego wyrażenia regularnego, które zaradzi tej sprawie.

edytowany 1x, ostatnio: Riddle
jurek1980
Te 111 i 222 są w danych wejściowych?
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Postów:3509
3

Zobacz to, chyba wystarczy szukać po znaku równości.
https://onlinephp.io/c/d3c1d

Kopiuj
<?php

$input = '{data v1="s1" v2="s2" v3="s3" key4="value4"}';
preg_match_all('/(\w+)="([^"]+)"/', $input, $matches);
print_r($matches);

$result = array_combine($matches[1], $matches[2]);

print_r($result);
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
2

Najprostsze jakie może być to:

Kopiuj
\w+="\w+"

Zakładając że Twoje v1 oraz s1 to [a-zA-Z0-9_]. Ja poszedłbym w tą drogę.

Jeśli s1 może być dowolnym znakiem, to

Kopiuj
\w+=".+?"
PA
Ja tam wolę wersję z [^"]+ bo juniory nie kumają że ? to ungreedy i jak potem trzeba coś zmienić to się gubią ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.