Jakim wyrażeniem wydobędę z czegoś takiego:
Ok a w czymś takim:
var_dump($data)
foreach($data['items'] as $item) { if(http://www.php.net/preg_match('/Szerokość/i', $item['label'])) { $Width = http://www.php.net/preg_match('/\d+(?:(?:,|\.)\d+)?/guim', $item['value'], $Width); http://www.php.net/echo "############" .$Width." #################"; } }
preg_match nie przeszukuje globalnie, od tego jest preg_match_all
Sprawdź też trzeci parametr preg_match.
Zauważyłem, 3-ci parametr niepotrzebyn. Usunąłem ale wciąż to samo.
Co to znaczy nie przeszukuje globalnie? Mam użyć teg preg_match_all? Sorry ale jestem początkujący jeśli chodzi o wyrażenia regularne. Szukam raczej gotowca z wyjaśnieniem.
Mógłbyś zajrzeć w dokumentację.
Dla preg_match_all jest wyjaśnienie:
Spróbuj tak pokombinować (chodzi o wyciąganie tych danych z tablicy):
$x = http://www.php.net/array_map(fn($i) => http://www.php.net/preg_replace('#[^0-9\,\.]#', '', $i), array_column($data, 'value'));
Z preg_replace zadziałało. Dzięki!
Jeśli oprócz wartości pojawi się cyfra w innym miejscu, np. w jednostce (cm2), to wynik będzie błędny.
Słuszna uwaga od trueblue.
Jeśli taka sytuacja zachodzi, to trzeba będzie doprecyzować wyrażenie, by np. wycinało wszystko co jest po pierwszej spacji lub literze. Zależy jakie wartości mogą pojawić się w 'value'.
Jeszcze jedno pytanie w temacie. Zanim wyjdzie mi taka ładna tablica jak w drugim poscie, wykonuję json_decode() na $raw_json który jest stringiem:
Pomijając problem niezamkniętej klamry na końcu, to jeżeli te `bi`, `bk` i `bd`, to stałe, to możesz użyć takiego kodu:
http://www.php.net/preg_replace('/\:b(?:i|d|k)}/ui', ':"0.00"}', $jsonString);
To tylko przykłady nazw stałych. Jest ich mnóśtwo wiecej niż bi, bk i bd. Nazwy różnej długości. Dlatego też chciałem łapać wszystko, co nie ma klamry.
Dodając cudzysłowy do bk, bi, itd., wynik parsowania jest poprawny.
Takiego stringa: 3,7 x 3,5 x 3,5 cm nie przetworzysz na wartość liczbową przy pomocy preg_replace.
Wiem o tym dlatego szukam regexpa, który zamieni "value":bi} na "value":"bi"}, "value":bk} na "value":"bk"} itd, itp. Ogólnie mówiąc, to co występuje po "value", a } i doda do tego " "
No dobra, to takie coś:
http://www.php.net/preg_replace('/"value":([a-z]+)}/ui', '"value":"${1}"}', $jsonString);
O dzięki, właśnie o coś takiego chodziło! Zadziałało, w sensie zmienia wartość value na "value" ale cały skrypt wypluwa jeszcze errory. Zauważyłem, że są też labele bez "":
$data = http://www.php.net/preg_replace('/"label":([a-z]+)}/ui', '"label":"${1}"}', $data);
Trochę nie rozumiem co ty robisz. Json jest albo poprawny, albo nie i wtedy jego poprawianie nie ma sensu. Teraz poprawisz 10 rzeczy a zaraz będzie kolejna zła. Zabawa bez sensu.
Radzę sobię, jak mogę. To nie jest JSON tylko fragment skryptu wycięty ze źródła strony. Takie dane niestety dostaję
Spróbuj takie coś. Koniecznie w tej kolejności:
$jsonString = http://www.php.net/preg_replace('/":\[\w\]([a-z]+)\[\/\w\]/ui', '":${1}', $jsonString); $jsonString = http://www.php.net/preg_replace('/":([a-z]+)(,|})/ui', '":"${1}"${2}', $jsonString);
Dzięki, o to właśnie chodziło! W niektórych plikach miałem jeszcze a$ jako nazwę zmiennej. Zmodyfikowałem wyrażenie na
i teraz 99,7% wsadów przetwarzana jest prawidłowo.
$data2 = http://www.php.net/preg_replace('/":\[\w\]([a-z$]+)\[\/\w\]/ui', '":${1}', $data2); $data2 = http://www.php.net/preg_replace('/":([a-z$]+)(,|})/ui', '":"${1}"${2}', $data2);
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)