Преобразование строки в массив | PHP | JS
Есть вот такая сложная строка:
[2,3], [['https://h8.rmr.rocks/','',"auto/54/43/58/001___________.png?t=1641084571&u=0&h=KiNURRSNRlWIHRfawmjv6Q",720,10706],['https://h38.rmr.rocks/','',"auto/54/43/58/002___________.png?t=1641084571&u=0&h=N3ncSIbn_PLRi-GpCme0vQ",720,11167],['https://h27.rmr.rocks/','',"auto/54/43/58/003___________.png?t=1641084571&u=0&h=vupT5VUvHQ6j1liMt6NF0A",720,12237],['https://h32.rmr.rocks/','',"auto/54/43/58/004___________.png?t=1641084571&u=0&h=hSbWgf646fK0fYKWksxaAA",720,13222],['https://h27.rmr.rocks/','',"auto/54/43/58/005___________.png?t=1641084571&u=0&h=vvcK12ZIA8wEnDcHcrKZWQ",720,12709],['https://h38.rmr.rocks/','',"auto/54/43/58/006___________.png?t=1641084571&u=0&h=-knVcY8GQpmTgw3XImiGIQ",720,12747],['https://h8.rmr.rocks/','',"auto/54/43/58/007___________.png?t=1641084571&u=0&h=yr5xwhHI_7_rcBsS8r6oVA",720,11670],['https://h32.rmr.rocks/','',"auto/54/43/58/008___________.png?t=1641084571&u=0&h=BDXPbLoAE58iwsYgH7u_ZQ",720,12414],['https://h24.rmr.rocks/','',"auto/54/43/58/009___________.png?t=1641084571&u=0&h=87VP6YSArvidx1wz0SXvFg",720,12251],['https://h37.rmr.rocks/','',"auto/54/43/58/010___________.png?t=1641084571&u=0&h=IIVF7DiFt3eoEx1X-LfILQ",716,7473],['https://h32.rmr.rocks/','',"auto/54/43/58/011___________.png_res.jpg?t=1641084571&u=0&h=vmYoIIEzU2uLm8dy5Qc51A",1920,1080]], 0, false, [{"path":"https://h32.rmr.rocks/","res":true},{"path":"https://h37.rmr.rocks/","res":true},{"path":"https://h8.rmr.rocks/","res":true},{"path":"https://h40.rmr.rocks/","res":true},{"path":"https://h27.rmr.rocks/","res":true},{"path":"https://h30.rmr.rocks/","res":true},{"path":"https://h42.rmr.rocks/","res":true},{"path":"https://h24.rmr.rocks/","res":true},{"path":"https://h31.rmr.rocks/","res":true},{"path":"https://h38.rmr.rocks/","res":true},{"path":"https://h34.rmr.rocks/","res":true}], false
Нужно её как-то с помощью PHP или JS преобразовать в массив.
ВАЖНО: в массив должны попадать лишь те данные, где параметры НЕ объекты.
Пример: ['https://h8.rmr.rocks/','',"auto/54/43/58/001___________.png?t=1641084571&u=0&h=KiNURRSNRlWIHRfawmjv6Q",720,10706] - попадет в массив, [{"path":"https://h32.rmr.rocks/","res":true},{"path":"https://h37.rmr.rocks/","res":true}] - не попадет в массив.
Пытался делать через PHP так, но это не очень эффективно, т.к. иногда две ссылки слипаются в одну:
$data = [];
preg_match_all('/\[\[(.*?)\]\]/is', $current_js, $_data);
foreach ($_data as $key => $value) {
if (count($value) > 0) {
$firstData = substr($value[0], 0, 1) === '[';
if ($firstData) {
$value = substr($value[0], 1, -1);
$images = explode(',', $value);
$old = '';
foreach ($images as $key2 => $valData) {
$valData = str_replace('[', '', $valData);
$valData = str_replace(']', '', $valData);
$valData = str_replace("''", '', $valData);
if (strlen($valData) > 0 && !is_numeric($valData)) {
$valData = str_replace("'", '', $valData);
$valData = str_replace('"', '', $valData);
preg_match_all('/https:\/\//is', $valData, $dda);
if (count($dda[0]) > 0) {
$old = $valData;
if (!array_key_exists($old, $data['images'])) $data['images'][$old] = '';
}
$data['images'][$old] .= $valData;
}
}
}
}
}
Можно ли как-то регуляркой вытащить нужные мне данные? Или есть другой способ?
Ответы (1 шт):
Смог решить задачу следующим способом:
preg_match_all("#(['|\"]((.*?)\.(?:png|jpg|jpeg|gif|png|svg)(.*?))['|\"])#is", $current_js, $links);
$_links = [];
foreach ($links as $key => $value) {
$_value = preg_replace("#\'|\"|\,|\s+#is", '', $value);
foreach ($_value as $k => $v) {
preg_match_all("#(http)?s?:?(\/\/[^\"']*\.(?:png|jpg|jpeg|gif|png|svg))#is", $v, $vl);
if(count($vl[0]) > 0) {
array_push($_links, $v);
}
}
}
$valid_links = array_unique($_links);
$data['images'] = $valid_links;
Сначала мы получаем все, что похоже на массив с ссылкой: preg_match_all("#(['|\"]((.*?)\.(?:png|jpg|jpeg|gif|png|svg)(.*?))['|\"])#is", $current_js, $links);
После этого удаляем из результата все запятые, скобки и т.п. $_value = preg_replace("#\'|\"|\,|\s+#is", '', $value);
Далее проверяем валидность ссылки на изображение (из-за кривой регулярки попадает в массив и .png, и https://.../__ (без окончания .png и т.п.)): preg_match_all("#(http)?s?:?(\/\/[^\"']*\.(?:png|jpg|jpeg|gif|png|svg))#is", $v, $vl);
Добавляем в массив: array_push($_links, $v); и фильтруем по уникальности: $valid_links = array_unique($_links);.
Я не очень хорошо разбираюсь в регулярках, так что, если кто-то знает, как сделать лучше, то напишите в комментарии.