странная жадность...

Статус
В этой теме нельзя размещать новые ответы.

black.cat

Мастер
Регистрация
13 Ноя 2008
Сообщения
200
Реакции
32
имееццо php5
PHP:
preg_match_all("@(<form.*?name=commentform.*?</form>)@is", $src, $forms );
но он не находит нужную форму с именем commentform
вся проблема в первом .*? если его заменить на совсем нежадный .? то все находит.
Такое общущение что .*? нежадное можно применить один раз. Но так же небывает...
Применял модификатор U - не помогло...

В результате находит один большой кусок начиная с первой <form> и заканчуя самой последней </form> в html коде

Подопытная строка:
HTML:
<FORM method=post name=commentform action=index.php> пиво </FORM>
П.С. задача тривиальная - быстро выдрать форму с определенным именем и экшном...
 
Либо это баг PHP, либо ты еще что-то пропустил.
Денвервоский PHP 5.24
PHP:
<?php
$src="<FORM method=post name=commentform action=index.php> пиво </FORM>";
preg_match_all("@(<form.*?name=commentform.*?</form>)@is", $src, $forms );  
print_r($forms);
Вывод
Код:
Array
(
    [0] => Array
        (
            [0] => <FORM method=post name=commentform action=index.php> пиво </FORM>
        )

    [1] => Array
        (
            [0] => <FORM method=post name=commentform action=index.php> пиво </FORM>
        )

)

З.Ы. .? жадный модификатор.
 
хм...
а вот этот код:
HTML:
123<FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>123

регекспом
PHP:
"@(<form.*?name=commentform.*?</form>)@is"
парсится неверно:
HTML:
Array
(
    [0] => Array
        (
            [0] => <FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>
        )

    [1] => Array
        (
            [0] => <FORM method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post name=commentform action=index.php> пиво </FORM>
        )

)

т.е. если целевая форма не первая - он результует с первого <form> по последний </form>

пробовал на разных несборочных php 5.2.5/fedora9, 5.2.8/win32
 
Ну естесно. Показываю наглядно, кусок регулярки - кусок текста.
<form - 123[<FORM] method=post ...
.*? - <FORM[ method=post name=not_beer action=index.php> wodka </FORM>123<FORM method=post ]name=commentform ...
name=commentform - ... method=post [name=commentform] action=index.php ...
.*?</form> - ... name=commentform[ action=index.php> пиво </FORM>]123
 
хм. так а шо делать?
как выдрать форму если она не одна ?
 
{<form[^>]+name=commentform\b.*?</form>}si
 
Работает :) Но логики непонимаю...

регексп начинается с "<form[^>]+"
это вродебы означает взять все начаиная с "<form" и заканчивая ">"
а как же поле name=commentform ? оно же какраз внутри <form >
но почемуто в выражении идет после закрывающего [^>]+
 
<form так и означает <form. [^>] означает лбюбой символ кроме >. + Означает что это подвыражение совпадает от одного до бесконечности раз. Т.е. за <form идет как минимум один символ, не являющийся >.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху