SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...

Как осуществить разбор подстрок одном выражением?

Допустим у нас есть JS код:
$js = <<<JS
...
const urls = ["url","url2","url3"];
let url = urls[0];
...
JS;

как извлечь массив значений foo одним выражением?
т.е. что-то вроде
preg_match('/urls = \[((?:"([^"]+)",?)+)\]/u',  $js, $matches);
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
https://regex101.com/r/51OTMP/1

<?php
$re = '/(?:urls = \["(?=\w+(?:","\w+){2,9}"\];)|(?!^)\G",")(\w+)/';
$str = <<<JS
...
const urls = ["url1","url2","url3"];
let url = urls[0];
...
JS;

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump(array_column($matches, 1));
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@PavelMos
так как в массиве могут быть разные строки, в том числе включающие разные специальные символы, проще брать целиком строку от [ до ], а потом через eval присвоить это какому-то новому объекту

urls.+(\[.*\]);\n

UPD
разобранную строку между [ и до ] можно преобразовать в список через split по
" , "
только брать за вычетом первого и последнего элемента- кавычек в начале и в конце строки. Если кавычки будут не двойные, а одинарные, то это нужно проверить и разбивать уже по ним.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
если я верно понял вопрос
$js = <<<JS
...
const urls = ["url","url2","url3"];
let url = urls[0];
...
JS;
preg_match_all('/"([^"]+)"/',$js,$array);        
var_dump($array[0]);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы