Это зависит от обработки отказа. Если Вы просто хотите пропустить ошибочные элементы, попробуйте внутри:
for(int i = 0; i < max; i++) {
String myString = ...;
try {
float myNum = Float.parseFloat(myString);
myFloats[i] = myNum;
} catch (NumberFormatException ex) {
--i;
}
}
В любом другом случае я предпочел бы попытку снаружи. Код более читаем, это более чисто. Возможно, было бы лучше бросить IllegalArgumentException в ошибочный случай вместо этого при возврате пустого указателя.
При работе с HTML используйте библиотеку DOM, а не регулярные выражения:
Украдено из http://blog.ianbicking.org/2008/03/30/python-html-parser-performance/ .
Из них я бы порекомендовал lxml, html5lib и BeautifulSoup.
Обратите внимание, что произвольные замены не могут быть выполнены однозначно. Рассмотрим следующие примеры:
HTML:
A<tag>B</tag>
Шаблон -> замена:
AB -> AXB
Возможные результаты:
AX<tag>B</tag>
A<tag>XB</tag>
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
Какие алгоритмы работают в вашем случае, во многом зависит от природы возможных шаблонов поиска и желаемых правил обработки неоднозначности.
Используйте синтаксический анализатор html, такой как предоставленный lxml
или BeautifulSoup
. Другой вариант - использовать преобразования XSLT ( XSLT в Jython ).
Я не думаю, что опубликованные до сих пор рекомендации библиотеки парсера DOM / HTML решают конкретную проблему в данном примере: переполнение
следует заменить на недостаточное переполнение
только тогда, когда ему предшествует stack
в визуализированном документе, независимо от того, есть ли между ними теги. Однако такая библиотека является необходимой частью решения.
Предполагая, что теги никогда не появляются в середине слов, одним из решений было бы
В 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-документ `переполнение стека.
Забавная штука, которую можно попробовать. Вроде как работает. Моим друзьям нравится, когда я прикрепляю этот скрипт к текстовому окну и позволяю им "переводить" вещи. Думаю, вы можете использовать его для чего угодно. Мех. Проверьте код несколько раз, если собираетесь его использовать, он работает, но я новичок во всем этом. Я думаю, прошло 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.
?>