2014-02-09 6 views
1

В html-файле я хочу добавить ссылку на цифры внутри [] в этих шаблонах: [1] или [1-2] или [1,3,6] или [1 , 3,4-6,9]. Я знаю, как соответствовать простым, например, первым:perl регулярное выражение для замены

$html =~ s`\[\d+\]`\[<a href="#$1"><$1>\]`g; 

Как насчет остальной части шаблонов?

также, для этого шаблона: [1], я хочу просто найти число, которое находится между [и], игнорируя что-либо еще в совпадении и подстановке шаблона, потому что в моем html-коде числа в [ ] может иметь разные html-коды, связанные с ними.

Спасибо!

+1

Вы должны показать, что именно вы хотите изменить их в. Учитывая '[1,3,4-6,9]', что вы хотите, чтобы он стал? – ooga

+1

Извините, я не прояснил свою цель. Цифры в [] являются цитатами в статье и должны быть связаны с фактическими ссылками в конце статьи (например, то, что вы видите в статьях Википедии). Номера в исходном html-файле не связаны. Я просто хочу, чтобы номера имели ссылки без изменения рисунка, например, 4-6 в [1,3,4-6,9] будут 4 - 6 bigbyte

+0

на ваш вопрос ответили? –

ответ

3

ОБНОВЛЕНО

Алгоритм:

use Data::Dumper; 

# input 
my $html = "[1],[1-2],[1,3,6],[1,3,4-6],[5]"; 

# result array 
my @result; 

# recursive way to generate html link tag 
sub asHtmlLink($) { 
    return "<a href=\"\#$_[0]\">$_[0]</a>"; 
} 

# seperate by , 
foreach (split(',',$html)) { 

    # match pattern 
    m/(\d+)(\-)?(\d+)?/g; 

    # if there is a digit after a minus 
    if (defined $3) { 
     push(@result,asHtmlLink($1).$2.asHtmlLink($3)); 
    } else { 
     push(@result,asHtmlLink($1)); 
    } 
} 

# dump 
print Dumper @result; 

Результат:

$VAR1 = '<a href="#1">1</a>'; 
$VAR2 = '<a href="#1">1</a>-<a href="#2">2</a>'; 
$VAR3 = '<a href="#1">1</a>'; 
$VAR4 = '<a href="#3">3</a>'; 
$VAR5 = '<a href="#6">6</a>'; 
$VAR6 = '<a href="#1">1</a>'; 
$VAR7 = '<a href="#3">3</a>'; 
$VAR8 = '<a href="#4">4</a>-<a href="#6">6</a>'; 
$VAR9 = '<a href="#5">5</a>'; 

Regex Ссылка: Regex101

+1

Возможно, это не то, что я хотел. текст должен оставаться неизменным после вставки URL-адреса для каждого номера. например, порядок чисел, запятых, гипсов должен оставаться неизменным в [1,3,4-6, 9]. – bigbyte

+1

ок у тебя! обновил мой ответ рабочим решением! –

+0

+1, но вы должны использовать '\ d' вместо' \ d {1} ', и, возможно,' \ d + ' – Toto

0
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>] 
+0

хорошо .. это настоящая власть .. но я не сейчас, что вы точно делаете;) можете ли вы предоставить свой вклад? –

+0

@AlexTape: вход состоит из случаев '' [1, 3-7, 10-11] ', ...,' [19-z] ''обработанных в' для моего $ h (...) 'цикл (сразу после предложения« Некоторые неофициальные тесты: »). – kjo

+0

@kjo нет необходимости расширять числа, фланкирующие дефис. для входа типа [9-19] выход должен быть [9 - 19]. – bigbyte

Смежные вопросы