Здравствуйте, __SPIRIT__, Вы писали:
__S>Здравствуйте, c-smile, Вы писали:
__S>Не работает для
__S>__S> str_istream si(
__S> "<a href='http://terrainformatica.com/index.php?a=1&b=2'>link</a>");
__S>
Похоже что нужно сделать так:
scanner::token_type scanner::scan_head()
{
wchar c = skip_whitespace();
if(c == '>') { c_scan = &scanner::scan_body; return scan_body(); }
if(c == '/')
{
wchar t = get_char();
if(t == '>') { c_scan = &scanner::scan_body; return TT_TAG_END; }
else { push_back(t); return TT_ERROR; } // erroneous situtation - standalone '/'
}
attr_name_length = 0;
value_length = 0;
// attribute name...
while(c != '=')
{
if( c == 0) return TT_EOF;
if( c == '>' ) { push_back(c); return TT_ATTR; } // attribute without value (HTML style)
if( is_whitespace(c) )
{
c = skip_whitespace();
if(c != '=') { push_back(c); return TT_ATTR; } // attribute without value (HTML style)
else break;
}
if( c == '<') return TT_ERROR;
append_attr_name(c);
c = get_char();
}
c = skip_whitespace();
// attribute value...
if(c == '\"')
while(c = get_char())
{
if(c == '\"') return TT_ATTR;
//if(c == '&') c = scan_entity();
append_value(c);
}
else if(c == '\'') // allowed in html
while(c = get_char())
{
if(c == '\'') return TT_ATTR;
//if(c == '&') c = scan_entity();
append_value(c);
}
else // scan token, allowed in html: e.g. align=center
do
{
if( is_whitespace(c) ) return TT_ATTR;
if( c == '>' ) { push_back(c); return TT_ATTR; }
append_value(c);
} while(c = get_char());
return TT_ERROR;
}
Но хочется конечно услышать мнение автора
Fast and Compact HTML/XML Scanner/Tokenizer c_smile