Соответствует первому вхождению строки

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
    У вас есть пример ввода и требуемый вывод?
  • 0
    Я разместил образец кода. Мне нужен только Привет и мир.
Показать ещё 5 комментариев
Теги:

2 ответа

2

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

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

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

my @nodes = $tree->find_nodes( '//b' );
1

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

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

или

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

Кстати, где <> символы в вашем регулярном выражении? Разве вы не хотите найти <A> а не просто A?

Вы, вероятно, имеете ввиду

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

См. Здесь: Как написать регулярное выражение, которое соответствует не жадным?

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

  • 0
    Как остановить это сначала на самой подстроке? @JohnB
  • 0
    Тем не менее я получаю содержание внутри ссылки. Спасибо попробую парсер HTML. Но я не хочу, чтобы содержимое внутри <A>. Так может ли анализатор HTML пренебрегать контентом внутри определенных тегов? @JohnB

Ещё вопросы

Сообщество Overcoder
Наверх
Меню