Autor Zpráva
Petr_
Profil *
Zdravím,

chtěl bych se zeptat na příklad reguláru uvedný v PHP dokumentaci zde: http://cz1.php.net/function.preg_match_all#example-4751.

Pokud jej mírně poupravím (viz zvýrazněná část):

<?php
// The \\2 is an example of backreferencing. This tells pcre that
// it must match the second set of parentheses in the regular expression
// itself, which would be the ([\w]+) in this case. The extra backslash is
// required because the string is in double quotes.
$html = "<strong>strong text</str><a href=howdy.html>click me</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);

foreach ($matches as $val) {
    echo "matched: " . $val[0] . "\n";
    echo "part 1: " . $val[1] . "\n";
    echo "part 2: " . $val[2] . "\n";
    echo "part 3: " . $val[3] . "\n";
    echo "part 4: " . $val[4] . "\n\n";
}
?>

tak i ta zvýrazněná část projde úspěšně regulárem. Chtěl bych se zeptat proč? Vím, že je tam za zpětná reference \\2, ale nechápu proč strong odpovídají i řetězce s, st, str, stro, atd. Šlo by to nějak upravit, aby se počáteční i koncový tag plně rovnali? Možnost přítomnosti atributů v tagu teď neberu v potaz.
Tori
Profil
Petr:
nechápu proč strong odpovídají i řetězce s, st, str, stro, atd
Část [\w]+ zachytí "str" v otvíracím i koncovém tagu, část [^>]*pak zachytí "ong". Můžete tomu zabránit např. změnou reguláru pro počáteční tag takto: (<([\w]+)(?:\s+[^>]+)?>), tj.: "pokud za tagem následují ještě další znaky, musí být oddělené mezerou".
Petr_
Profil *
Tori:
část [^>]*pak zachytí "ong"
Ách, tak tohle mi uniklo...
Děkuji za řešení a vysvětlení.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: