Я предлагаю захватывая все ключевые -значные пары с регулярным выражением:
'~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~'
(см regex demo), а затем
См IDEONE demo
$re = '~(?:([^][]*)\b\[|(?!^)\G)\s*(\w+(?:-\w+)*(?:=(["\'])?[^\]]*?\3)?)~';
$str = "Loader[data-prop data-attr=\"value\" more-here='data' and-one-more=\"\"]";
preg_match_all($re, $str, $matches);
$arr = array();
for ($i = 0; $i < count($matches); $i++) {
if ($i != 0) {
$arr = array_merge(array_filter($matches[$i]),$arr);
}
}
print_r(preg_grep('~\A(?![\'"]\z)~', $arr));
Выход:
Array
(
[3] => data-prop
[4] => data-attr="value"
[5] => more-here='data'
[6] => and-one-more=""
[7] => Loader
)
Заметки о регулярных выражений (он выглядит слишком сложным):
(?:([^][]*)\b\[|(?!^)\G)
- граница: мы только начинаем m atching на [
, которому предшествует слово (a-zA-Z0-9_
) символ (с \b\[
) или сразу после успешного матча (с (?!^)\G
). Кроме того, ([^][]*)
будет захватывать в группу 1 часть перед [
.
\s*
- соответствует ноль или более пробельных символов
(\w+(?:-\w+)*)
- захватывает в группе 2 "слова" как "word1" или "word1-WORD2" ... "word1-wordn"
(?:=(["\'])?[^\]]*?\3)?
- необязательная группа (в связи с (?:...)?
) соответствие
=
- знак равенства
(["\'])?
- Группа 3 (вспомогательная группа для проверки значения разделителя) захвата либо "
, '
или ничего
[^\]]*?
- закрытие '
или "
(то же значение, захваченной в 3-й группе) - (значение) ноль или более других, чем ]
как можно
\3
символов.
Поскольку мы не можем избавиться от захвата '
или "
, мы можем preg_grep
все элементы, которые мы не заинтересованы в с preg_grep('~\A(?![\'"]\z)~', $arr)
где \A(?![\'"]\z)
соответствует любой строке, которая не равна '
или "
.
Будет ли каждый элемент Loader иметь такую же строковую структуру? Я имею в виду, что собственность и ценность всегда будут разделены одним пространством? – SebasSBM
Я думаю ['preg_match_all ('~ (?: \ [| (?! ^) \ G) \ s * (\ w + (?: - \ w +) *) (?: ="? ([^ "\] ] *))? ~ ', $ txt, $ matches) '] (https://regex101.com/r/tY6rF6/1) должно быть достаточно. –