2013-12-13 3 views
0

У меня есть HTML-код, который должен удалить содержимое тега. Их около 30 человек. Он находится в различных местах внутри HTML кода, какСовпадение первого появления строки

<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 
<b>Hello </b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN> 
</A><b>World</b> 
<A class=tooltiplink href="javascript:void;" style="color:#000000"><img src="images/footnote.jpg" border="0"><SPAN style="margin:0 0 0 0px;"> unwanted info 4:6 </SPAN></A> 

Желаемая выход: Hello World

При попытке удалить содержимое тега в $_=~s/A(.+)?\/A//gs;. Он также обрабатывает полезную информацию внутри последнего тега. Слишком эффект g тоже имеет тот же эффект. Как удалить только содержимое тега без первого и последнего совпадения друг с другом, а также удалить полезную информацию.

+0

У вас есть пример ввода и требуемую мощность? – chooban

+0

Я разместил образец кода. Мне нужен только Привет и мир. – xtreak

+0

Некоторая информация необходима, чтобы дать общий исчерпывающий ответ: 1) Я предполагаю, что это лишь частичная часть большего HTML-кода, возможно, несколько случаев, например, ваш образец. 2) как мы можем определить, что (какие критерии) в качестве разделителя соответствует тому, который соответствует вашему «первому» . 3) unwanted info is the one between first peer блока 4), можно ли предположить, что блок ВСЕГДА на нескольких линиях или может быть в одной строке также (и в этом случае необходима коррекция) – NeronLeVelu

ответ

1

Ваша проблема заключается в том, что регулярное выражение является жадным, то есть оно совпадает с самой длинной совпадающей подстрокой (формирует самый первый A до самого последнего/A). Попробуйте нежадную версию оператора +:

$_=~s/A(.+?)?\/A//gs; 

или

$_=~s/A(.*?)\/A//gs; 

Кстати, где находятся <> символы в своем регулярном выражении? Не вы хотите найти <A>, а не только A?

Вы, вероятно, означает

$_=~s/\<A\>.*?\<\/A\>//gs; 

Смотрите здесь: How can I write a regex which matches non greedy?

Комментарий: Это не очень хорошая идея для разбора HTML с регулярными выражениями, так как слишком много может пойти не так (например, с вышеизложенным подходом вы делаете не найти теги с пробелами в них). Если упражнение предназначено для быстрого и грязного решения специальной проблемы, используйте анализатор HTML!

+0

Как остановить его при первой подстроке? @JohnB – xtreak

+0

По-прежнему я получаю контент внутри ссылки. Спасибо, я попробую парсер HTML. Но я не хочу содержания внутри . Может ли HTML-парсер пренебрегать содержанием внутри определенных тегов? @JohnB – xtreak

2

Я думаю, что, хотя вы можете сделать это с помощью регулярного выражения, это не лучший способ. Пример TreeBuilder и некоторые XPath предоставят вам гораздо более удобное решение.

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

my $tree= HTML::TreeBuilder::XPath->new; 
$tree->parse_file("mypage.html"); 

my @nodes = $tree->find_nodes('//b'); 
Смежные вопросы