Go Back   Armenian Knowledge Base > Technical sections > Webmaster Zone > Web Development

Reply
 
Thread Tools

Простенькая задачка ;)
Old 29.10.2003, 09:39   #1
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Question Простенькая задачка ;)

Напишите на любом языке (пхп/перл/с) простенький тэг парсер, а именно:

Имеем строку типа
Code:
blah blah <input type=radio name='gago' value="My name > 'Gago'  < ... blah... " CHECKED> blah blah
Выудить из этой строки тэг "input" (ну или просто первый попавшийся) и загнать в ассоциативный массив все параметры с соответствующими значениями (в том числе и CHECKED с каким-нить _NULL значением)

Слабо?

З.Ы. Для любителей регексов, которые будут возмущаться по поводу `<',`>' в параметре value могут сами проверить работоспособность приведенного тэга в любом браузере, и еще подумать над таким вот случаем:
Code:
onClick="if(a > b) alert(' priexali:P ');"
__________________
[ que fors aus ne le sot riens nee ]

Old 29.10.2003, 12:01   #2
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Exclamation

Да, кстати это тестовое задание. Нашей фирме требуются веб-девелоперы.
Зарплата: $150. Жду ответов.
__________________
[ que fors aus ne le sot riens nee ]

Old 01.11.2003, 10:20   #3
Школьник
 
Join Date: 04 2002
Location: Vanadzor
Posts: 227
Rep Power: 0
Default

PHP Code:
<?
error_reporting(0);
$file = 'some.html';


$html = implode ('', file ($file)); 

$start_tag_flag = $end_tag_flag = 0;
$I = $i = 0;

$PARSED_ARRAY = array();
$PARSED_ATTRS = array();

while( $i < strlen($html) ) {
    $c = $html[$i];
    $n = $html[$i+1];
    $tag = '';

    if( $c == '<' && $n != '/' ) {
        $start_tag_flag = 1;
        while( 1 ) {
            $c = $html[++$i];
            if( $c == ' ' || $c == '>' )  break;
            if( $c == '<' ) {
                $tag = '';
                break;
            }
            $tag .= $c;
        }

        if( !$tag ) continue;

        $end_tag_flag = 0;
        $PARSED_TAGS[$I] = $tag;
        $ARR = array();

        while( $c != '>' ) {
            $end_chr = ' ';
            $attr = $value = '';
            $start_q = $v = 0;
            while( 1 ) {
                $c = $html[++$i];

                if( $c == '=' ) {
                    $v = 1;
                    $c = $html[++$i];
                }

                if( $c == '"' && !$start_q) {
                    $end_chr = '"';
                    if( !$start_q ) {
                        $start_q = 1;
                        $c = $html[++$i];
                    }
                }else if( $c == "'" && !$start_q) {
                    $end_chr = "'";
                    if( !$start_q ) {
                        $start_q = 1;
                        $c = $html[++$i];
                    }
                }

                if( ($start_q && $c == $end_chr) || (!$start_q && ($c == $end_chr || $c == '>')) ) break;

                if( $v == 1 )
                    $value .= $c;
                else
                    $attr .= $c;
            }

            if( $attr && $attr != '/' && $attr != '?' ) {
                 $ARR[$attr] = $value;
            }
        }
        $PARSED_ATTRS[$I] = $ARR;
        $I++;
    }else if( $c == '<' && $n == '/' ) {
        $end_tag_flag = 1;
        $i++;
        while( 1 ) {
            $c = $html[++$i];
            if( $c == '>' )  break;
            $tag .= $c;
        }
        $PARSED_TAGS[$I] = "/$tag";
        $PARSED_ATTRS[$I] = array();
        $I++;
        $start_tag_flag = 0;
    }

    $i++;
}


for($i=0; $i<$I; $i++){
    echo "<b>$PARSED_TAGS[$i]</b><br>";
    foreach( $PARSED_ATTRS[$i] as $a => $b ){
        echo "&nbsp;&nbsp;&nbsp;$a -> $b<br>";
    }
    echo "<hr>";
}

?>

da kstati ya rabotayu tolko freelance.

Old 01.11.2003, 16:03   #4
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Default

решение правильное, но будет работать довольно медленно. Желательно использовать strpos, который работает намного быстрее итераций в цикле.

К сожалению нам нужны фул-тайм работники.
__________________
[ que fors aus ne le sot riens nee ]
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 16:08.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.