У меня есть код 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 тоже имеет тот же эффект. Как удалить только содержимое тега без первого и последнего совпадения друг с другом, а также удалить полезную информацию.
Я думаю, что, хотя вы можете сделать это с помощью регулярного выражения, это не лучший способ. Подобные TreeBuilder и некоторые XPath предоставят вам гораздо более удобное решение.
После того, как вы загрузили HTML в древовидную структуру, требуемый XPath может быть таким же простым, как:
my $tree= HTML::TreeBuilder::XPath->new;
$tree->parse_file( "mypage.html");
my @nodes = $tree->find_nodes( '//b' );
Ваша проблема в том, что регулярное выражение является жадным, то есть оно соответствует самой длинной подстроке (формирует самый первый A до самого последнего /A). Попробуйте нежелательную версию оператора +:
$_=~s/A(.+?)?\/A//gs;
или
$_=~s/A(.*?)\/A//gs;
Кстати, где <> символы в вашем регулярном выражении? Разве вы не хотите найти <A>
а не просто A
?
Вы, вероятно, имеете ввиду
$_=~s/\<A\>.*?\<\/A\>//gs;
См. Здесь: Как написать регулярное выражение, которое соответствует не жадным?
Комментарий: Не рекомендуется анализировать HTML с регулярными выражениями, так как слишком много может пойти не так (например, с помощью вышеуказанного подхода вы не найдете тегов с пробелами в них). Если упражнение предназначено для быстрого и грязного решения специальной проблемы, используйте анализатор HTML!