Форум программистов, компьютерный форум, киберфорум
PHP: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264

Возможное отсутствие тега между другими и из-за этого сжирается текст до следующего совпадения

12.10.2014, 15:33. Показов 1164. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу конвертер в котором нужно преобразовывать элементы в ul ol li списки. Словом, нужно заменить
HTML5
1
2
<p class=MsoListParagraphCxSpMiddle>1.<span></span>Какой-то нужный текст</p> на ol li
<p class=MsoListParagraphCxSpMiddle>[любой символ кроме цифры]<span></span>Какой-то нужный текст</p> на ul li
Уменя есть две регулярочки
C#
1
2
(<[^<]*=MsoListParagraphCxSpMiddle[^>]*>[0-9]+\.)(.+?)(<\/p>)
(<[^<]*=MsoListParagraphCxSpMiddle[^>]*>.*?span\>)(.+?)(<\/p>)
Они, вроде как, работают как нужно, если пустить их в заданном порядке, но в обратном, ясное дело вторая регулярка сжирает все цифры, если можно как-то это изменить, поможите, но, главный вопрос в другом:
Существуют еще и пустые параграфы вида:
HTML5
1
<p class=MsoListParagraphCxSpMiddle></p>
Из-за них вообще кусок текста сжирается, поэтому приходится предварительно прогнать текст регуляркой:
C#
1
(<[^<]*=MsoListParagraphCxSpFirst[^>]*>)([^\<\>]*?)(<\/p>)
Все это, как видно, на соплях и жопой, можно как-нибудь более адекватно реализовать? Нормальный конвертер из docx в html, кажется не существует в природе, а те что существуют, разбираться дольше, чем самому написать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2014, 15:33
Ответы с готовыми решениями:

Нужно сделать, чтобы значение атрибута тега отображался внутри этого тега
Как сделать чтобы html-код &lt;div class=&quot;item&quot;&gt;text&lt;/div&gt; отображался примерно вот так: del Изображения и любые другие файлы...

Запрос на вывод всех записей, которые имеют совпадения с другими по полю
Подскажите, пожалуйста, как написать запрос. Есть таблица Table1 с двумя полями и . Как написать запрос на вывод всех записей,...

Вставка ЦЕНЫ по условию совпадения тега с данными строки
Сейчас php страница выводит: &lt;offer id=&quot;123&quot;&gt; &lt;url&gt;site.ru/tovar123&lt;/url&gt; &lt;price&gt;4100&lt;/price&gt; &lt;/offer&gt; &lt;offer...

6
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 17:31
Цитата Сообщение от PhpNewbie Посмотреть сообщение
как видно, на соплях и жопой
Шикарнейшее определение, когда для работы с DOM используют регулярку! "Регулярные выражение - не инструмент для парсинга HTML" - это можно в рамочку и на стену.
Ваш исходный html-код, даёт мало представления о том, как нужно действовать и было бы не плохо, если бы вы показали, что хотели получить в итоге. Поэтому делаю интуитивно и предполагаю, что тег <p> с классом "MsoListParagraphCxSpMiddle" должен стать <ul> или <ol>, а дочерние элементы <span> - преобразованы в <li>.
Как это работает, можно посмотреть тут (нажать Run или F9).
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_in = <<<STR
<p class=MsoListParagraphCxSpMiddle>1.<span>Пункт 1.1</span><span>Пункт 2.1</span></p>
<p class=MsoListParagraphCxSpMiddle>[любой символ кроме цифры]<span>Пункт А.1</span><span>Пункт Б.1</span></p>
<p class=MsoListParagraphCxSpMiddle>100500<span>Пункт А.2</span><span>Пункт Б.2</span></p>
<p class=MsoListParagraphCxSpMiddle>что-то<span>Пункт 2.1</span><span>Пункт 2.2</span></p>
STR;
 
$dom = new DomDocument();
$ies = libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($html_in, 'HTML-ENTITIES', 'UTF-8'));
libxml_use_internal_errors($ies);
$finder = new DomXPath($dom);
$pEl = $finder->query("//*[contains(@class, 'MsoListParagraphCxSpMiddle')]");
foreach($pEl as $p){
    $firstType = (int)$p->childNodes->item(0)->nodeValue != 0 ? 'ol' : 'ul';
    $list = $dom->createElement($firstType);
    foreach($p->childNodes as $child){
        if($child->nodeName == 'span') {
            $li = $dom->createElement('li', $child->nodeValue);
            $list->appendChild($li);
        }
    }
    $p->parentNode->replaceChild($list, $p);
}
echo $dom->saveHTML();
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
12.10.2014, 19:11  [ТС]
Lazy_Den,
Не совсем, там типа есть p с параметрами:
HTML5
1
2
3
MsoListParagraphCxSpFirst преобразовать в ul li /li
MsoListParagraphCxSpMiddle в li /li
MsoListParagraphCxSpLast в li /li /ul
Но нужно еще учитывать, что между тегами может иметься цифра
HTML5
1
<p class=MsoListParagraphCxSpMiddle>1.<span>
Тогда преобразовывать нужно в нумерованный список, если цифры нет, то ненумерованный.
С дом документами как-то работал, но использовал чисто для парсинга, а не для генерации из одной хтмл страницы, другой. В принципе docx это обычный архив с xml документом внутри, который можно напрямую преобразовывать, там уже да, лучше работать с соответствующими инструментами.

Добавлено через 4 минуты
Ах, да между <p> и <span> находится символ параграфа - цифра или другой, потом идет мусор разный и между </span> и </p> заключительным находится уже нужный контент. Но суть в том, что иногда, повторяюсь, бывают пустые параграфы, без спанов, а тупо <p> и </p>, в этом как бы проблема.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 19:30
PhpNewbie, Вы покажите кусок исходного контента, лучше даже с проблемными его местами, а потом покажите то, что должно получится в итоге.
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
12.10.2014, 19:49  [ТС]
В нумерованный список:
HTML5
1
2
3
<p class=MsoListParagraphCxSpFirst>1.<span></span>Какой-то нужный текст</p>
<p class=MsoListParagraphCxSpMiddle>2.<span></span>Какой-то нужный текст</p>
<p class=MsoListParagraphCxSpLast>3.<span></span>Какой-то нужный текст</p>
В обычный:
HTML5
1
2
3
<p class=MsoListParagraphCxSpFirst>qwerty<span></span>Какой-то нужный текст</p>
<p class=MsoListParagraphCxSpMiddle>qwerty<span></span>Какой-то нужный текст</p>
<p class=MsoListParagraphCxSpLast>qwerty<span></span>Какой-то нужный текст</p>
Проблемное место пустой элемент, без спанов, его можно вообще просто убрать.
HTML5
1
<p class=MsoListParagraphCxSp(Middle|Last|First)>&nbsp;</p>
В принципе, я хотел реализацию именно на регулярках. Но раз нет, так нет, буду потихоньку на дом документ переделывать. Кстати, программа на C#, но в разделе шарпа я не нашел раздела с регулярками.
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 20:04
Цитата Сообщение от PhpNewbie Посмотреть сообщение
Кстати, программа на C#
Хм... А вот тут, я вам вряд ли смогу чем-то помочь. Может было бы логичней этот вопрос задать в соответствующем разделе форума?
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
12.10.2014, 22:32  [ТС]
Да не, это я к слову. Пхп тоже знаю, переписать одно под другое сумею. Просто, говорю, в соответствуюшем разделе не нашел раздела для регулярок, странно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2014, 22:32
Помогаю со студенческими работами здесь

Найти текст между тегами и создать файлы из этого текста
Здравствуйте! Есть задача, помогите ее решить. Например, имеем текстовый файл 1.txt Нужно найти в этом файле тексты, куски (их...

Найти текст между тегами и создать файлы из этого текста
Здравствуйте! Есть задача, помогите ее решить. Например, имеем текстовый файл 1.txt Нужно найти в этом файле тексты, куски (их...

Сформировать наибольшее возможное число из цифр максимального и минимального элементов этого массива
Дан массив целых чисел. Сформировать наибольшее возможное число из цифр максимального и минимального элементов этого массива. При решении...

Как через lxml достать сразу текст тега и текст подтега?
Имеется такой html: &lt;h3&gt; &lt;a&gt;Text1&lt;span&gt;Text2&lt;/span&gt;&lt;/a&gt; &lt;/h3&gt; Как можно достать сразу и Text1, и Text2? Я пользовался...

Как сравнить элемент массива с другими элементами этого же по значению?
Здравствуйте, мне нужно сравнить определенный элемент массива с другими элементами по значению. К примеру дан массив чисел. Мне нужно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru