Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.143.1.57] |
|
Сообщ.
#1
,
|
|
|
Есть вот такой код:
$str = "<input type=hidden name=\"thisistest\" value=\"2082347\">\n"; @result1 = $str =~m/(.*)(<input )(.*)(name\=")(.*)(")(.*)/; @result2 = $str =~m/(.*)(<input )(.*)(value\=")(.*)(")(.*)/; print "$result1[4]\n"; print "$result2[4]\n"; $result2[4] - выдает как мне и надо 2082347, однако $result1[4] выдает thisistest" value="2082347. Вопрос: почему??? '.' вроде обозначает любой символ, так что, пробел не считаеться за любой символ? Что тогда есть любой символ? |
Сообщ.
#2
,
|
|
|
А что надо сделать?
|
Сообщ.
#3
,
|
|
|
Michail04, в том-то и дело, что '.' проглатывает остальную часть строки. В таком случае нужно либо точно указывать класс допустимых (а в данном случае недопустимых [^"]) символов, либо использовать квантификатор жадности '?':
@result1 = $str =~m/(.*)(<input )(.*)(name\=")(.*?)(")(.*)/; // или @result1 = $str =~m/(.*)(<input )(.*)(name\=")([^"]*)(")(.*)/; |
Сообщ.
#4
,
|
|
|
Ну там же нет учёта конца тега. И не понятно к какому тегу может относиться атрибут NAME.
Надо бы: print "[$_]\n" foreach '<input name="abc"><a name="1324@df">353324324</a>'=~/(.*?)<input\s*[^>]*?name\s*=\s*(?="(.+?)"|([^>\s]+))[^>]*?>(.*)/iso; |
Сообщ.
#5
,
|
|
|
Цитата Trustmaster @ а в данном случае недопустимых [^"]) символов Сэнкс! Это именно то что нужно. |