3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
1

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

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

Author24 — интернет-сервис помощи студентам
Пишу конвертер в котором нужно преобразовывать элементы в 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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; ...

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

6
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 17:31 2
Цитата Сообщение от 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  [ТС] 3
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
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 19:30 4
PhpNewbie, Вы покажите кусок исходного контента, лучше даже с проблемными его местами, а потом покажите то, что должно получится в итоге.
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
12.10.2014, 19:49  [ТС] 5
В нумерованный список:
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
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
12.10.2014, 20:04 6
Цитата Сообщение от PhpNewbie Посмотреть сообщение
Кстати, программа на C#
Хм... А вот тут, я вам вряд ли смогу чем-то помочь. Может было бы логичней этот вопрос задать в соответствующем разделе форума?
0
3 / 3 / 2
Регистрация: 05.01.2013
Сообщений: 264
12.10.2014, 22:32  [ТС] 7
Да не, это я к слову. Пхп тоже знаю, переписать одно под другое сумею. Просто, говорю, в соответствуюшем разделе не нашел раздела для регулярок, странно.
0
12.10.2014, 22:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2014, 22:32
Помогаю со студенческими работами здесь

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

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

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

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

Выявить все треугольники, не пересекающиеся с другими треугольниками этого набора
Всем привет! Пишу курсовик, столкнулся проблемой на самом важном пункте моей поставленной...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru