Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 29.10.2003, 09:39   #1
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
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 ');"
Reply With Quote
Old 29.10.2003, 12:01   #2
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
Exclamation

Да, кстати это тестовое задание. Нашей фирме требуются веб-девелоперы.
Зарплата: $150. Жду ответов.
Reply With Quote
Old 01.11.2003, 10:20   #3
Школьник
 
Join Date: 04 2002
Location: Vanadzor
Posts: 227
Downloads: 0
Uploads: 0
Reputation: 0 | 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( 
) {
            
$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( 
) {
                
$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 == )
                    
$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( 
) {
            
$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.
Reply With Quote
Old 01.11.2003, 16:03   #4
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
Default

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

К сожалению нам нужны фул-тайм работники.
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 20:49.


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