or1ko's diary

日々を書きます

Parsecの練習 〜 hrefの値を取り出す 〜

Parsecを勉強したので、
htmlのアンカータグのhref属性の値を取り出す処理を書いた。

標準入力から読み込んだテキストから、
href="aaaa"といったところから、 "aaaa"をとりだす。

import System.IO (getContents)
import Text.ParserCombinators.Parsec 
import Data.List (null)

main = getContents >>= return . parse html "(input)" >>= return . either show unlines >>= putStr

html = do 
  many (noneOf "h") 
  s <- many href'
  return . filter (not . null) $ s

href' = do
  s <- try href <|> (string "h"  >> return [])
  many (noneOf "h")
  return s

href = do
  string "href"
  spaces
  char '='
  spaces
  value

value = do
  oneOf "\"\'"
  v <- many (noneOf "\"\'")
  oneOf "\"\'"
  return v