Autor | Zpráva | ||
---|---|---|---|
Petr_ Profil * |
#1 · Zasláno: 11. 10. 2013, 19:23:56
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 * |
#3 · Zasláno: 12. 10. 2013, 00:44:07
Tori:
„část [^>]*pak zachytí "ong"“ Ách, tak tohle mi uniklo... Děkuji za řešení a vysvětlení. |
||
Časová prodleva: 11 let
|
0