Version 14 of Regexp HTML Attribute Parsing

Updated 2007-01-29 16:31:02

20040711 CMcC: here's a little HTML/XML/SGML attribute parser. It's iterative, but it uses regexps extensively.

    array set match {
        quote {^([a-zA-Z0-9_-]+)[ \t]*=[ \t]*["]([^"]+)["][ \t]*(.*)$}
        squote {^([a-zA-Z0-9_-]+)[ \t]*=[ \t]*[']([^']+)['][ \t]*(.*)$}
        uquote {^([a-zA-Z0-9_-]+)[ \t]*=[ \t]*([^ \t'"]+)[ \t]*(.*)$} 
        }

    proc parseAttr {astring} {
        global match
        array set attr {}
        set astring [string trim $astring]
        if {$astring eq ""} {
        return {}
        }

        while {$astring != ""} {
        foreach m {quote squote uquote} {
            set org $astring
            if {[regexp $match($m) $astring all var val suffix]} {
                set attr($var) $val
                set astring [string trimleft $suffix]
            }
        }
        if {$astring == $org} {
            error "parseAttr: can't parse $astring - not a properly formed attribute string"
        }

        }
        return [array get attr]
    }

Since you are considering the dark side of markup parsing, you might also enjoy XML Shallow Parsing with Regular Expressions

LES: Regex are too often criticized by those who just don't know or like them. "If only you knew the power of the dark side..."

NEM: Regular Expressions Are Not A Good Idea for Parsing XML, HTML, or e-mail Addresses. Regular expressions can be immensely useful -- I use them frequently for pulling apart simple (regular) strings. However, there are genuine limits to the power of regexps, and people should be aware of them. Especially for situations (such as parsing XML/HTML) where there exist (several) excellent quality full parsers.

LES: I find your lack of faith disturbing. E-mail cannot be parsed with regex. But XML can. Feel free to ask for help whenever you need it and think it can't be done.

NEM: XML cannot be parsed purely with regexp. You can parse XML by applying several regexps, and using additional code to put things together correctly. If you put a lot of time and effort into it and fix all the edge cases, you'll end up with something resembling the pure-Tcl version of TclXML, I suspect. But what's the point? It's a waste of time reinventing a perfectly good wheel.


Tcllib also contains a module, htmlparse, for parsing HTML code.


[ Category internet | Category XML ]