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

Регулярное выражение

24.06.2021, 21:07. Показов 2370. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите собрать регулярное выражение, уж очень у меня с ними пока что плохо.
Поиск осуществляется в шаблоне:
HTML5
1
2
3
4
5
6
7
8
9
10
11
<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
</div>
Нужно загнать в переменную $sublime значение из data-sublime="3"
А в переменную $content все, что находится внутри <div class="class_1" data-sublime="3">
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.06.2021, 21:07
Ответы с готовыми решениями:

Регулярное выражение
serial-1-sezon-3-seriya Есть данная строчка. Необходимо узнать что за сезон и что за серия, как верно составить выражение?

Регулярное выражение
Выражение: 111(.*)111 Строка: 111 000 111 222 111 Получается: 000 111 222 А нужно чтобы было: 000 То есть обрезало до первого...

Регулярное выражение
Добрый день! Подскажите как получить ссылку с текстом между тегами? Пример текста: &lt;div class=&quot;top-desc&quot;&gt; ...

7
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.06.2021, 07:42
Можно так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
 
$input = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
</div>';
 
preg_match('#sublime="(\d+)">(.+)\R#s', $input, $matches);
 
[, $sublime, $content] = $matches;
 
var_dump($sublime, $content);
0
51 / 38 / 13
Регистрация: 20.01.2019
Сообщений: 115
25.06.2021, 10:32
Лучший ответ Сообщение было отмечено zikz как решение

Решение

если работаешь с html, то правильнее использовать соответствующие инструменты:
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
$html = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
</div>';
// эта опция нужна, если html невалидный
// libxml_use_internal_errors(true); 
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$elements = $xpath->query("//div[@data-sublime]");
foreach($elements as $el) {
    echo $el->getAttribute('data-sublime') . "\n";
    $content = '';
    foreach($el->childNodes as $cn) {
        $content .= trim($cn->C14N());
    }
    echo $content . "\n";
}
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.06.2021, 14:33
Цитата Сообщение от ke1evra Посмотреть сообщение
правильнее использовать соответствующие инструменты
Тогда так:
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
<?php
 
$input = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
</div>';
 
$dom = new DOMDocument;
$dom->loadHTML($input, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
 
$root = $dom->documentElement;
 
$sublime = $root->getAttribute('data-sublime');
$content = '';
 
foreach ($root->childNodes as $value) {
    $content .= $value->C14N();
}
 
var_dump($sublime, $content);
Или так:
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
<?php
 
$input = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
</div>';
 
$element = new SimpleXMLElement($input);
 
$sublime = (string) $element->attributes()['data-sublime'];
$content = '';
 
foreach ($element->children() as $value) {
    $content .= $value->asXML();
}
 
var_dump($sublime, $content);
0
51 / 38 / 13
Регистрация: 20.01.2019
Сообщений: 115
25.06.2021, 14:46
simplexml медленный и если добавить ещё одну ноду с data-sublime то получим ошибку в этом решении.
а если по первому твоему варианту, то получаем атрибут только первой ноды.
поэтому xpath best of the best
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.06.2021, 15:00
Цитата Сообщение от ke1evra Посмотреть сообщение
simplexml медленный
Шта? Сравни скорость.
Твой код (убрал только вывод в поток):
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
<?php
 
$input = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
    <div data-sublime="3">Hello</div>
</div>';
 
$start = microtime(true);
 
for ($i = 0; $i < 10000; $i++) {
    $dom = new DOMDocument();
    $dom->loadHTML($input);
    $xpath = new DOMXPath($dom);
    $elements = $xpath->query("//div[@data-sublime]");
    foreach($elements as $el) {
        $sublime = $el->getAttribute('data-sublime');
        $content = '';
 
        foreach($el->childNodes as $cn) {
            $content .= trim($cn->C14N());
        }
    }
}
 
echo microtime(true) - $start;
И мой, с simplehtml:
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
<?php
 
$input = '<div class="class_1" data-sublime="3">
    <div class="class_2">
        <span>Title</span>
    </div>
 
    <div class="class_3 Clearfix">
        <p>
            Content
        </p>
    </div>
    <div data-sublime="3">Hello</div>
</div>';
 
$start = microtime(true);
 
for ($i = 0; $i < 10000; $i++) {
    $element = new SimpleXMLElement($input);
 
    $sublime = (string) $element->attributes()['data-sublime'];
    $content = '';
     
    foreach ($element->children() as $value) {
        $content .= $value->asXML();
    }
}
 
echo microtime(true) - $start;
Твой вариант раз в 6 медленнее.
Цитата Сообщение от ke1evra Посмотреть сообщение
если добавить ещё одну ноду с data-sublime то получим ошибку в этом решении
Куда именно добавим? Какую ошибку?
Цитата Сообщение от ke1evra Посмотреть сообщение
то получаем атрибут только первой ноды
Ты разглядел, какой HTML-код нужно разобрать ТС'у? Он где-то сказал, что у него огромный документ, утыканный подобными блоками?

И создавать полное HTML-дерево (без LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD) только для того, чтобы разобрать кусочек кода в 5 строк -- это сильно.
0
0 / 0 / 0
Регистрация: 05.08.2020
Сообщений: 13
25.06.2021, 21:13  [ТС]
Цитата Сообщение от ke1evra Посмотреть сообщение
если работаешь с html, то правильнее использовать соответствующие инструменты:
А есть ли у этого варианта что-то по типу preg_replace_callback?
Этот кусок кода который я предоставил, вырезка из другой переменной, в которой так же могут быть такие же блоки и другие ноды.
В идеале значение из data-sublime заносится в переменную, весь html этого блока заменяется на другой, допустим на <div class="class">{значение из переменной data-sublime}</div>, и так с каждым блоком найденным в переменной.

Я смог осуществить это при помощи preg_replace_callback и поковыряв сайт regex101. Но возможно все же вариант с DOMDocument будет более правильный?
0
51 / 38 / 13
Регистрация: 20.01.2019
Сообщений: 115
25.06.2021, 22:38
Лучший ответ Сообщение было отмечено zikz как решение

Решение

Цитата Сообщение от zikz Посмотреть сообщение
что-то по типу preg_replace_callback
с нодами можно работать как угодно - создавать, удалять, изменять, заменять и т.п. я не видел задачу, поэтому пальцем в небо трудно сказать, как правильнее решить. навскидку, можно сделать так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
foreach($elements as $el) {
    $sublime = $el->getAttribute('data-sublime');
    
    $div = $dom->createElement('div');
    $div->setAttribute('class', 'some-class');    
    $div->nodeValue = $sublime;
    
    $replace = $el->cloneNode();
    $replace->appendChild($div);
    
    $el->parentNode->replaceChild($replace, $el);
}
    
echo htmlspecialchars($dom->C14N());
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.06.2021, 22:38
Помогаю со студенческими работами здесь

Подскажите регулярное выражение
не селен я в регулярных выражениях спасайте выручайте..... - не срочно но надо :) как в массив $a выбрать из текста все что...

Регулярное выражение preg_match
Есть строчка &lt;/div&gt;&lt;span class=&quot;product-info__title-description&quot;&gt;&lt;/span&gt;&lt;div class=&quot;product-info__voblers&quot;&gt; пытаюсь спарсить это...

Регулярное выражение в PHP
$url=&quot;http://tmgame.ru/userinfo.php?uim&amp;nick=1%20&quot;; echo $url; $homepage = file_get_contents($url); preg_match_all(&quot;#line...

Объясните регулярное выражение
Имеется регулярное выражение для принятия конкретных символов Помогите понять что где находится и как мне сделать несколько регулярных...

Регулярное выражение, перенос строк
$text = preg_replace((.+?)\#i&quot; ], , trim($text, ' ')); Как правильно прописать &quot;#\r\n#&quot; так, чтобы замена &lt;br/&gt;...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru