Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 01.10.2018
Сообщений: 11

Вычистить XML от лишнего

01.11.2018, 13:16. Показов 1567. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как вычистить во всех товарах из XML все кроме offer id=" (например тут 61709) и того что находится в теге model (тут <model>EASYMAT 140-0.5-5,0</model>)
Можно в несколько шагов.

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<offer id="61709" type="vendor.model" available="true">
<url>
https://site.ru/6-obogrevateli/338-teplie-poli/61709-komplekt-teplogo-pola-caleo-easymat-140-05-50.html
</url>
<price>5380</price>
<currencyId>RUB</currencyId>
<categoryId>338</categoryId>
<market_category>не назначена</market_category>
<picture>
https://site.ru/image/data/products/55e3c19c039c683354ea32a45ebed00c.jpg
</picture>
<description>
Предназначен для монтажа
</description>
<store>true</store>
<pickup>true</pickup>
<delivery>true</delivery>
<delivery-options>
<option cost="200" days="0-2"/>
</delivery-options>
<typePrefix>Комплект теплого пола </typePrefix>
<vendor>CALEO</vendor>
<model>EASYMAT 140-0.5-5,0</model>
<sales_notes>Выдаем дисконтную карту со скидкой до покупок.</sales_notes>
<param name="Страна производитель">Россия</param>
<param name="Вид нагревательного элемента">кабель</param>
<param name="Площадь обогрева, м2">5</param>
<param name="Удельная мощность, Вт/м2">140</param>
<param name="Питание, В">220</param>
<param name="Ширина мата, м">0.5</param>
</offer>
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.11.2018, 13:16
Ответы с готовыми решениями:

Xml+php и ничего лишнего
Привет всем Дайте пож скрипт достающий инфу из хтмл. Я поискал в гугле, везде много разной ерунды я просто уже не могу лишнего напишут...

Очень много лишнего в коде но без этого "лишнего" не работает
Сильно не пинайте я месяц как Delphi изучаю. Заранее благодарен. procedure TForm1.Button1Click(Sender: TObject); begin if...

Как вычистить мусор ?
Вирусов как таковых может и нет, но набрался набор всякого хлама, типа байду. Как это все убрать?

7
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
01.11.2018, 14:58
Как-то вы не понятно излагаете задачу... Исходная строка есть - ок. Как она должна выглядеть после обработки?
1
0 / 0 / 0
Регистрация: 01.10.2018
Сообщений: 11
01.11.2018, 17:01  [ТС]
Цитата Сообщение от VNIIAEN Посмотреть сообщение
Как она должна выглядеть после обработки?
Да хоть как)) главное вычистить мусор. Например вот так:
<offer id="61709" EASYMAT 140-0.5-5,0
Я что-то не могу даже сообразить как выделять диапазон сквозь строки например от слова <offer до </offer
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
01.11.2018, 17:23
Лучший ответ Сообщение было отмечено marat1984 как решение

Решение

Можно регулярками:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
$str = <<<'XML'
    <offer id="61709" type="vendor.model" available="true">
    <url>
    https://site.ru/6-obogrevateli/338-teplie-poli/61709-komplekt-teplogo-pola-caleo-easymat-140-05-50.html
    </url>
    <price>5380</price>
    <currencyId>RUB</currencyId>
    <categoryId>338</categoryId>
    <market_category>не назначена</market_category>
    <picture>
    https://site.ru/image/data/products/55e3c19c039c683354ea32a45ebed00c.jpg
    </picture>
    <description>
    Предназначен для монтажа
    </description>
    <store>true</store>
    <pickup>true</pickup>
    <delivery>true</delivery>
    <delivery-options>
    <option cost="200" days="0-2"/>
    </delivery-options>
    <typePrefix>Комплект теплого пола </typePrefix>
    <vendor>CALEO</vendor>
    <model>EASYMAT 140-0.5-5,0</model>
    <sales_notes>Выдаем дисконтную карту со скидкой до покупок.</sales_notes>
    <param name="Страна производитель">Россия</param>
    <param name="Вид нагревательного элемента">кабель</param>
    <param name="Площадь обогрева, м2">5</param>
    <param name="Удельная мощность, Вт/м2">140</param>
    <param name="Питание, В">220</param>
    <param name="Ширина мата, м">0.5</param>
    </offer>
XML;
 
$patt = '~(?<offer>(?<=<offer id=")\d+(?="))|(?<model>(?<=<model>).+?(?=</model>))~';
preg_match_all($patt, $str, $arr);
$arr = array_map('array_filter', $arr);
 
$offer = $arr['offer'];
$model = $arr['model'];
 
var_dump($offer, $model);
Но обычно рекомендуют для подобных целей использовать подходящую библиотеку.
1
0 / 0 / 0
Регистрация: 01.10.2018
Сообщений: 11
02.11.2018, 08:48  [ТС]
Цитата Сообщение от VNIIAEN Посмотреть сообщение
Но обычно рекомендуют для подобных целей использовать подходящую библиотеку.
Спасибо ВАМ!

Скажите пожалуйста, что делают дополнительные скобки оборачивающие уже рабочее выражение?
(?<offer>(внутри уже рабочее выражение))|(?<model>(Внутри уже рабочее выражение))
Где про это можно почитать? Это вроде доп фильтра? Я нашел только про look-behind условия, но но тут просто скобки с вопросом (?...)
Спасибо

Добавлено через 17 минут
И еще вопросик))
как просто найти сквозь переходы строк, например, начиная от <price> до </categoryId>
чтобы было найдено:
<price>180000</price>
<currencyId>RUB</currencyId>
<categoryId>2</categoryId>
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
02.11.2018, 11:36
Цитата Сообщение от marat1984 Посмотреть сообщение
Скажите пожалуйста, что делают дополнительные скобки оборачивающие уже рабочее выражение?
(?<offer>(внутри уже рабочее выражение))|(?<model>(Внутри уже рабочее выражение))
Это именованные подмаски. Их синтаксис бывает двух видов:

1. (?<offer>...)
2. (?'offer'...)

Каким из двух вариантов пользоваться - решать вам. К примеру, если шаблон регулярного выражения записан в одинарных кавычках, то чтобы использовать вариант №2, придётся добавлять экранирование:

'~(?\'offer\'...)~'

Поэтому лично я использую в именованных подмасках вариант с угловыми скобками. Ключевое слово "offer" (или любое другое слово, которое вы запишете между угловыми скобками именованной подмаски) станет именем ключа в результирующем ассоциативном массиве.
Цитата Сообщение от marat1984 Посмотреть сообщение
И еще вопросик))
как просто найти сквозь переходы строк, например, начиная от <price> до </categoryId>
чтобы было найдено:
<price>180000</price>
<currencyId>RUB</currencyId>
<categoryId>2</categoryId>
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$str = 'Какой-то лишний текст <price>180000</price>
<currencyId>RUB</currencyId>
<categoryId>2</categoryId>
Какой-то лишний текст';
 
 
$patt = '~<price>.+</categoryId>~s';
preg_match($patt, $str, $arr);
 
print_r($arr);
/*
Array
(
    [0] => <price>180000</price>
           <currencyId>RUB</currencyId>
           <categoryId>2</categoryId>
)
*/


Добавлено через 6 минут
Модификатор s, добавленный в конце шаблона, включит для символьного класса "." ("точка" - это символьный класс, означающий совпадение с любым символом, кроме символов перевода строк) режим соответствия любому символу, в том числе и символу перевода строки. А "жадный" квантификатор "+" выполнит захват максимально возможных совпадений.
1
0 / 0 / 0
Регистрация: 01.10.2018
Сообщений: 11
02.11.2018, 14:58  [ТС]
PHP ищет отлично.

Саблайм не понимает включение \s перевода строк после ~.
Это значит никак нельзя строки с переходами на новые искать с помощью только самих регулярок?
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
02.11.2018, 20:57
Цитата Сообщение от marat1984 Посмотреть сообщение
Саблайм не понимает включение \s перевода строк после ~.
Это значит никак нельзя строки с переходами на новые искать с помощью только самих регулярок?
Не могу знать - я по саблайму не советчик. Но можно же скриптом искать необходимые соответствия )

Добавлено через 37 минут
marat1984, вот написал регулярку под Саблайм:
PHP
1
(?<!<price>)<price>.+\n*(?:<\w+>.+\n*)+</categoryId>
Проверял на таком тексте:
HTML5
1
2
3
4
5
6
7
8
9
10
Какой-то лишний текст
 
<price>180000</price>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<categoryId>2</categoryId>
 
Какой-то лишний текст
В совпадении участвуют следующие строки:
HTML5
1
2
3
4
5
6
<price>180000</price>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<currencyId>RUB</currencyId>
<categoryId>2</categoryId>
Добавлено через 5 часов 4 минуты
UPD Подправил шаблон:
PHP
1
<price>.+\n*(?:<\w+>.+\n*)+</categoryId>
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.11.2018, 20:57
Помогаю со студенческими работами здесь

Вычистить миллисекунды из текущего времени
Добрый день! Есть значение миллисекунд (к примеру равно 2000), есть текущее время &quot;15.22.13&quot; (hh:mm:ss). Как можно из текущего...

Как правильно вычистить майнер?
Здравствуйте! Майнеры ловлю уже не первый раз. Вчера поймал майнер с такими симптомами: у меня видеокарта asus strix - это значит что...

Одновременно вычистить несколько текстовых полей
Привет. Есть 2 текстовых поля и 2 формы для ввода текста. При клике по кнопке необходимо почистить все текстовые поля. Есть ли возможность...

Как вычистить записи о регистрациях на других машинах?
как windows вычисистить от регистраций на других машинах по SMB протоколу (то есть те которые сохраняются при подключение к шарам...

Не удается вычистить систему от амиго, мэйлру, спам в браузерах
Нужен хэлп в очистке от последствий скачивания зараженных файлов и установки на комп вредоносных программ: были установлены вирусом: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru