Как найти/заменить текст в HTML при сохранении тегов/структуры HTML

Это зависит от обработки отказа. Если Вы просто хотите пропустить ошибочные элементы, попробуйте внутри:

for(int i = 0; i < max; i++) {
    String myString = ...;
    try {
        float myNum = Float.parseFloat(myString);
        myFloats[i] = myNum;
    } catch (NumberFormatException ex) {
        --i;
    }
}

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

6
задан Ned Batchelder 6 December 2009 в 19:34
поделиться

6 ответов

При работе с HTML используйте библиотеку DOM, а не регулярные выражения:

  • lxml: синтаксический анализатор, документ и сериализатор HTML. Также для синтаксического анализа можно использовать BeautifulSoup и html5lib.
  • BeautifulSoup: синтаксический анализатор, документ и сериализатор HTML.
  • html5lib: синтаксический анализатор. У него есть сериализатор.
  • ElementTree: объект документа и сериализатор XML
  • cElementTree: объект документа, реализованный как расширение C.
  • HTMLParser: парсер.
  • Genshi: включает в себя синтаксический анализатор, документ и сериализатор HTML.
  • xml.dom.minidom: модель документа, встроенная в стандартную библиотеку, которую html5lib может анализировать.

Украдено из http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/ .

Из них я бы порекомендовал lxml, html5lib и BeautifulSoup.

9
ответ дан 8 December 2019 в 16:04
поделиться

Beautiful Soup или HTMLParser - вот ваш ответ.

3
ответ дан 8 December 2019 в 16:04
поделиться

Обратите внимание, что произвольные замены не могут быть выполнены однозначно. Рассмотрим следующие примеры:

1)

HTML:

A<tag>B</tag>

Шаблон -> замена:

AB -> AXB

Возможные результаты:

AX<tag>B</tag>
A<tag>XB</tag>

2)

HTML:

A<tag>A</tag>A

Шаблон -> замена:

A+ -> WXYZ

Возможные результаты:

W<tag />XYZ
W<tag>X</tag>YZ
W<tag>XY</tag>Z
W<tag>XYZ</tag>
WX<tag />YZ
WX<tag>Y</tag>Z
WX<tag>YZ</tag>
WXY<tag />Z
WXY<tag>Z</tag>
WXYZ

Какие алгоритмы работают в вашем случае, во многом зависит от природы возможных шаблонов поиска и желаемых правил обработки неоднозначности.

3
ответ дан 8 December 2019 в 16:04
поделиться

Используйте синтаксический анализатор html, такой как предоставленный lxml или BeautifulSoup . Другой вариант - использовать преобразования XSLT ( XSLT в Jython ).

1
ответ дан 8 December 2019 в 16:04
поделиться

Я не думаю, что опубликованные до сих пор рекомендации библиотеки парсера DOM / HTML решают конкретную проблему в данном примере: переполнение следует заменить на недостаточное переполнение только тогда, когда ему предшествует stack в визуализированном документе, независимо от того, есть ли между ними теги. Однако такая библиотека является необходимой частью решения.

Предполагая, что теги никогда не появляются в середине слов, одним из решений было бы

  1. обработать DOM, разметить все текстовые узлы и вставить уникальный идентификатор в начале каждого токена (например, слова)
  2. отображать документ как обычный текст
  3. искать и заменять простой текст регулярными выражениями, которые используют группы для сопоставления, сохранения и отмечать уникальные идентификаторы в начале каждого токена
  4. извлекать все токены с отмеченными уникальными идентификаторами из простого текста
  5. обрабатывать DOM, удаляя уникальные идентификаторы и заменяя соответствующие токены отмеченные уникальные идентификаторы с соответствующими измененными токенами
  6. отображают обработанный DOM обратно в HTML

Пример:

В 1. HTML DOM,

stack <sometag>overflow</sometag>

становится DOM

#1;stack <sometag>#2;overflow</sometag>

, а в 2. создается простой текст :

#1;stack #2;overflow

Регулярное выражение, необходимое в 3.: # (\ d +); stack \ s + # (\ d +); overflow \ b и замена # \ 1; stack% \ 2; потеря значимости . Обратите внимание, что только второе слово помечается изменением # на % в уникальном идентификаторе, так как первое слово не изменяется.

В 4. слово ] underflow с уникальным идентификатором под номером 2 извлекается из результирующего открытого текста, поскольку он был помечен изменением # на % .

] В 5. все # (\ d +); идентификаторы удаляются из текстовых узлов модели DOM при поиске их номеров среди извлеченных слов. Номер 1 не найден, поэтому # 1; стек заменяется простым стеком . Число 2 найдено с измененным словом underflow , поэтому # 2; overflow заменяется на underflow .

Наконец в 6. Модель DOM отображается обратно в HTML-документ `переполнение стека.

0
ответ дан 8 December 2019 в 16:04
поделиться

Забавная штука, которую можно попробовать. Вроде как работает. Моим друзьям нравится, когда я прикрепляю этот скрипт к текстовому окну и позволяю им "переводить" вещи. Думаю, вы можете использовать его для чего угодно. Мех. Проверьте код несколько раз, если собираетесь его использовать, он работает, но я новичок во всем этом. Я думаю, прошло 2 или 3 недели с тех пор, как я начал изучать php.


<?php

$html = ('<div style="border: groove 2px;"><p>Dear so and so, after reviewing your application I. . .</p><p>More of the same...</p><p>sincerely,</p><p>Important Dude</p></div>');

$oldWords = array('important', 'sincerely');

$newWords = array('arrogant', 'ya sure');

// function for oldWords
function regex_oldWords_word_list(&$item1, $key)
{

    $item1 = "/>([^<>]+)?\b$item1(tionally|istic|tion|ance|ence|less|ally|able|ness|ing|ity|ful|ant|est|ist|ic|al|ed|er|et|ly|y|s|d|'s|'d|'ve|'ll)?\b([^<>]+)?/";

}

// function for newWords
function format_newWords_results(&$item1, $key)
{

    $item1 = ">$1<span style=\"color: red;\"><em> $item1$2</em></span>$3";

}

// apply regex to oldWords
array_walk($oldWords, 'regex_oldWords_word_list');

// apply formatting to newWords
array_walk($newWords, 'format_newWords_results');

//HTML is not always as perfect as we want it
$poo = array('/  /', '/>([a-zA-Z\']+)/', '/’/', '/;([a-zA-Z\']+)/', '/"([a-zA-Z\']+)/', '/([a-zA-Z\']+)</', '/\.\.+/', '/\. \.+/');

$unpoo = array(' ', '> $1', '\'', ';  $1', '"  $1', '$1  <', '. crap taco.', '. crap taco with cheese.');

//and maybe things will go back to normal sort of
$repoo = array('/>  /', '/;  /', '/"  /', '/  </');

$muck = array('> ', ';', '"',' <');

//before
echo ($html);

//I don't know what was happening on the free host but I had to keep stripping slashes
//This is where the work is done anyway.
$html = stripslashes(preg_replace($repoo , $muck , (ucwords(preg_replace($oldWords , $newWords , (preg_replace($poo , $unpoo , (stripslashes(strtolower(stripslashes($html)))))))))));

//after
echo ('<hr/> ' . $html);

//now if only there were a way to keep it out of the area between
//<style>here</style> and <script>here</script> and tell it that english isn't math.

?>
-1
ответ дан 8 December 2019 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: