Преобразование строки в массив | 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 шт):

Автор решения: Sire IMPACTUS

Смог решить задачу следующим способом:

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);.

Я не очень хорошо разбираюсь в регулярках, так что, если кто-то знает, как сделать лучше, то напишите в комментарии.

→ Ссылка