Я знаю? оператор включает «не жадный» режим, но я столкнулся с проблемой, я не могу обойтись. Рассмотрим такую строку:
my $str = '<a>sdkhfdfojABCasjklhd</a><a>klashsdjDEFasl;jjf</a><a>askldhsfGHIasfklhss</a>';
, где есть открывающие и закрывающие теги <a>
и </a>
, есть клавиши ABC, DEF и GHI, но они окружены каким-то другим случайным текстом. Я хочу заменить <a>klashsdjDEFasl;jjf</a>
на <b>TEST</b>
например. Однако, если у меня есть что-то вроде этого:
$str =~ s/<a>.*?DEF.*?<\/a>/<b>TEST><\/b>/;
Даже с не жадными операторами. * ?, это не делает то, что я хочу. Я знаю, почему он этого не делает, потому что первый <a>
соответствует первому вхождению в строке и полностью соответствует DEF, а затем соответствует ближайшему закрытию </a>
. Однако мне нужен способ сопоставления ближайшего открытия <a>
и закрытия </a>
с "DEF". Так что в настоящее время я получаю это в результате:
<a>TEST</b><a>askldhsfGHIasfklhss</a>
Где, поскольку я ищу что-то, чтобы получить этот результат:
<a>sdkhfdfojABCasjklhd</a><b>TEST</b><a>askldhsfGHIasfklhss</a>
Кстати, я здесь не пытаюсь разобрать HTML, я знаю, что для этого есть модули, я просто спрашиваю, как это можно сделать.
Спасибо,
Эрик Сейферт