use strict;
use Carp::Assert 'assert';
sub replace {
my $html = shift;
# first expand subexpressions of the for "n-m"; (will fail if
# n > m !)
1 while $html =~ s{
(\[\s*(?:\s*\d\s*,\s*)*) # prefix (1)
(\d+)\s*-\s*(\d+) # target (2, 3)
(?=[^\]]*\]) # suffix (lookahead)
}
{assert($2 <= $3),
$1 . join(", ", $2..$3)}ex;
# now replace individual integers with hyperlinks
1 while $html =~ s{
(\[\s*(?:\s*\d+\s*,\s*)*) # prefix (1)
(\d+) # target (2)
(?=[^\]]*\]) # suffix (lookahead)
}
{$1\n<a href="#$2">$2</a>}x; # \n added to make
# output easier to
# to read; it's safe
# to omit it
return $html;
}
Некоторые неофициальные тесты:
for my $h ('[1, 3-7, 10-11 ]',
'[ 0]',
'[1 ]',
'[ ]',
'[ 9-19]',
'[9-9]',
'[19-9]',
'[19-z]'
) {
my $r = eval { replace($h); };
if ([email protected]) {
$r = [email protected];
}
printf "%s\n%s\n\n", $h, $r;
}
Выход:
[1, 3-7, 10-11 ]
[
<a href="#1">1</a>,
<a href="#3">3</a>,
<a href="#4">4</a>,
<a href="#5">5</a>,
<a href="#6">6</a>,
<a href="#7">7</a>,
<a href="#10">10</a>,
<a href="#11">11</a> ]
[ 0]
[
<a href="#0">0</a>]
[1 ]
[
<a href="#1">1</a> ]
[ ]
[ ]
[ 9-19]
[
<a href="#9">9</a>,
<a href="#10">10</a>,
<a href="#11">11</a>,
<a href="#12">12</a>,
<a href="#13">13</a>,
<a href="#14">14</a>,
<a href="#15">15</a>,
<a href="#16">16</a>,
<a href="#17">17</a>,
<a href="#18">18</a>,
<a href="#19">19</a>]
[9-9]
[
<a href="#9">9</a>]
Вы должны показать, что именно вы хотите изменить их в. Учитывая '[1,3,4-6,9]', что вы хотите, чтобы он стал? – ooga
Извините, я не прояснил свою цель. Цифры в [] являются цитатами в статье и должны быть связаны с фактическими ссылками в конце статьи (например, то, что вы видите в статьях Википедии). Номера в исходном html-файле не связаны. Я просто хочу, чтобы номера имели ссылки без изменения рисунка, например, 4-6 в [1,3,4-6,9] будут 4 - 6 – bigbyte
на ваш вопрос ответили? –