#!/usr/bin/perl use strict; use warnings; use Test::More; # Jednoduchá podmnožina HTML: # - nemá komentáře # - nemá nepárové tagy # - nepředpokládejte nic o tom, které tagy mohou být uvnitř kterých # - jméno tagu je \w+ # - jméno atributu je \w+ # - jméno entity je &\w+; # - hodnota atributu je vždy uvedena a má jeden z těchto tvarů: # - řetězec libovolných znaků kromě ["'>&] # - zauvozovkovaný řetězec znaků různých od ["&] + entity # - zaapostrofovaný řetězec znaků různých od ['&] + entity sub html($) { return $_[0] =~ m{^ (?(DEFINE) (?&\w+;) (?([^<&]|(?&ent))*) (?[^'">&]*) (?"([^"&]|(?&ent))*") (?'([^'&]|(?&ent))*') (?\s+\w+=((?&val)|(?&qval)|(?&aval))) (?<(?\w+)(?&arg)*>(?&flow)) (?(?&text)((?&tag)(?&text))*) ) (?&flow) $}x; } ok(html('Kobyla ma maly bok')); ok(html('Kobyla ma maly bok')); ok(html('Kobyla ma "maly" bok')); ok(!html('Kobyla ma " bok')); ok(html('Kobyla ma maly bok')); ok(!html('Kobyla')); ok(html('Kobyla')); ok(html('')); ok(html("")); ok(!html('')); ok(html('
  • brum
  • ')); ok(!html('
  • brum')); ok(!html('
  • brum')); ok(!html('
  • brum
  • ')); ok(html('
        brum
    ')); ok(!html('
        brum
    ')); ok(html('
    • brum
    • mnau
    ')); ok(html('

    MCSE: Minesweeper Consultant, Solitaire Expert

    ')); ok(!html('

    MCSE: Minesweeper Consultant, Solitaire Expert

    ')); ok(html('

    ' . '' x 100 . 'hu!' . '' x 100 . '

    ')); ok(!html('

    ' . '' x 100 . 'hu!' . '' x 100 . '')); done_testing;