Страница 1 из 1

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 10:44:47
Духовитин
Уважаемые здравствуйте!

У меня такая задача. Я её решил думаю не самым изящным и в плане производительности оптимальным способом. Прошу вашей помощи в более верном варианте.
Есть исходный текст такого формата:

Код: Выделить всё

<---|KEY_1|--->
Содержимое ключа 1
<---END--->
<---|FIELD_3|--->
Содержимое другого ключа
<---END--->
И в результате парсинга мне надо из этого текста получить массив:

Код: Выделить всё

Array(
  "KEY_1"   => "Содержимое ключа 1",
  "FIELD_3" => "Содержимое другого ключа"
)
Сейчас я это реализовал по тупому:
Сперва разбиваю в массив по разделителю "<---END--->"
Затем оббегаю все полученные элементы ивычленяю из них соответственно ключ и значение.

Есть ощущение что это делается проще и изящнее. Помогите пожалуйста.

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 11:47:26
Alex Keda
Регуляркой.....

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 12:12:13
Духовитин
А можно в наглую попросить кусок кода? Потому что с регулярными выражениями я совсем ни в зуб ногой.

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 13:16:02
Alex Keda
Аналогично ;(

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 13:18:06
Духовитин
Ладно, может кто забредёт умеющий этими магическими кракозябрами работать :)

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 15:11:11
FreeBSP
чета типа

Код: Выделить всё

/<---|(.*?)|--->(.*?)<---|END|--->/si

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 15:26:07
Духовитин
FreeBSP спасибо.
Попробовал, но такая вот конструкция:

Код: Выделить всё

$str='<---|MY_DATA|--->
TEST
<---|END|--->';
$patt='/<---|(.*?)|--->(.*?)<---|END|--->/si';
$arr=Array();
preg_match_all($patt, $str, $arr);
var_dump($arr);
$arr=preg_split($patt, $str);
var_dump($arr);
Выдаёт полнейшую жесть:

Код: Выделить всё

array(3) { [0]=> array(61) { [0]=> string(4) "<---" [1]=> string(0) "" [2]=> string(1) "|" [3]=> string(0) "" [4]=> string(1) "M" [5]=> string(0) "" [6]=> string(1) "Y" [7]=> string(0) "" [8]=> string(1) "_" [9]=> string(0) "" [10]=> string(1) "P" [11]=> string(0) "" [12]=> string(1) "A" [13]=> string(0) "" [14]=> string(1) "G" [15]=> string(0) "" [16]=> string(1) "E" [17]=> string(0) "" [18]=> string(1) "1" [19]=> string(0) "" [20]=> string(1) "|" [21]=> string(0) "" [22]=> string(1) "-" [23]=> string(0) "" [24]=> string(1) "-" [25]=> string(0) "" [26]=> string(1) "-" [27]=> string(0) "" [28]=> string(1) ">" [29]=> string(0) "" [30]=> string(1) " " [31]=> string(0) "" [32]=> string(1) "T" [33]=> string(0) "" [34]=> string(1) "E" [35]=> string(0) "" [36]=> string(1) "S" [37]=> string(0) "" [38]=> string(1) "T" [39]=> string(0) "" [40]=> string(1) " " [41]=> string(4) "<---" [42]=> string(0) "" [43]=> string(1) "|" [44]=> string(0) "" [45]=> string(1) "E" [46]=> string(0) "" [47]=> string(1) "N" [48]=> string(0) "" [49]=> string(1) "D" [50]=> string(0) "" [51]=> string(1) "|" [52]=> string(0) "" [53]=> string(1) "-" [54]=> string(0) "" [55]=> string(1) "-" [56]=> string(0) "" [57]=> string(1) "-" [58]=> string(0) "" [59]=> string(1) ">" [60]=> string(0) "" } [1]=> array(61) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(1) "|" [3]=> string(0) "" [4]=> string(1) "M" [5]=> string(0) "" [6]=> string(1) "Y" [7]=> string(0) "" [8]=> string(1) "_" [9]=> string(0) "" [10]=> string(1) "P" [11]=> string(0) "" [12]=> string(1) "A" [13]=> string(0) "" [14]=> string(1) "G" [15]=> string(0) "" [16]=> string(1) "E" [17]=> string(0) "" [18]=> string(1) "1" [19]=> string(0) "" [20]=> string(1) "|" [21]=> string(0) "" [22]=> string(1) "-" [23]=> string(0) "" [24]=> string(1) "-" [25]=> string(0) "" [26]=> string(1) "-" [27]=> string(0) "" [28]=> string(1) ">" [29]=> string(0) "" [30]=> string(1) " " [31]=> string(0) "" [32]=> string(1) "T" [33]=> string(0) "" [34]=> string(1) "E" [35]=> string(0) "" [36]=> string(1) "S" [37]=> string(0) "" [38]=> string(1) "T" [39]=> string(0) "" [40]=> string(1) " " [41]=> string(0) "" [42]=> string(0) "" [43]=> string(1) "|" [44]=> string(0) "" [45]=> string(1) "E" [46]=> string(0) "" [47]=> string(1) "N" [48]=> string(0) "" [49]=> string(1) "D" [50]=> string(0) "" [51]=> string(1) "|" [52]=> string(0) "" [53]=> string(1) "-" [54]=> string(0) "" [55]=> string(1) "-" [56]=> string(0) "" [57]=> string(1) "-" [58]=> string(0) "" [59]=> string(1) ">" [60]=> string(0) "" } [2]=> array(61) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" } } 
array(62) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" [43]=> string(0) "" [44]=> string(0) "" [45]=> string(0) "" [46]=> string(0) "" [47]=> string(0) "" [48]=> string(0) "" [49]=> string(0) "" [50]=> string(0) "" [51]=> string(0) "" [52]=> string(0) "" [53]=> string(0) "" [54]=> string(0) "" [55]=> string(0) "" [56]=> string(0) "" [57]=> string(0) "" [58]=> string(0) "" [59]=> string(0) "" [60]=> string(0) "" [61]=> string(0) "" }

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-25 21:36:27
FreeBSP

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-26 7:57:48
Духовитин
FreeBSP за ссылки спасибо, но у меня целый скачанный с php.net мануал есть. Там и про регулярные выражения тоже глава имеется.
Тут написал в надежде, что те кто умеют регулярки, помогут не предложением самому выучить (хотя предложение дельное), а в надежде что дадут работающий пример для конкретно указанного случая.

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-26 20:40:55
FreeBSP
я тыкнул не на весь необъемный ман, а на конкретные вещи где косяки

а именно: надо заменить | на \|

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-26 21:00:28
Духовитин
FreeBSP спасибо!

Всё в точности как надо. Сейчас проведу замеры скорости варианта с регулярками и с обычным explode'ным способом, тут отпишусь для информации.
А то в мануале про функции парсинга регулярками написано что они мощные но типа более медленные чем простые функции типа explode.

Спасибо ещё раз за помощь!

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-02-28 15:58:19
Alex Keda
вам мильён строк чтоле распарсить надо?
если нет - я б даже и не чесался...

[PHP] Помогите распарсить строку в массив

Добавлено: 2015-03-01 20:31:12
Духовитин
Нет, у меня это для парсинга шаблонов. А их мильён не мильён, но если можно использовать вариант в одну строчку или вариант в две строчки, то вроде дел-то немного, а микрооптимизация лишней не будет.

Проект хоть и в стадии создания, но делаю для использования, а там кто знает какие масштабы будут :)

В php мануале с комментариями от пользователей просто несколько раз видел, по разным функциям есть чувак который выдаёт, что вот это если делать так, то такое время, если через массив то так, если ещё эдак то вот. Считаю полезно иметь такую информацию :)

Как говорится: "Копейка рубль бережёт"

[PHP] Помогите распарсить строку в массив

Добавлено: 2016-04-05 21:15:27
Гость

Код: Выделить всё

$data = "<---|KEY_1|--->
Содержимое ключа 1
<---END--->
<---|FIELD_3|--->
Содержимое другого ключа
<---END--->";

$result = [];

foreach(explode('<---END--->', $data) as $content) {
    $content = trim($content);
    if ( $content ) {
        list($key, $content) = explode("\n", $content, 2);
        list(, $key) = explode("|", $key);
        $result[$key] = trim($content);
    }
}

print_r($result);

Код: Выделить всё

Array
(
    [KEY_1] => Содержимое ключа 1
    [FIELD_3] => Содержимое другого ключа
)