首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用聚乙二醇问题制作BBcode解析器

用聚乙二醇问题制作BBcode解析器
EN

Stack Overflow用户
提问于 2011-09-19 23:43:21
回答 3查看 229关注 0票数 0

我正在用聚乙二醇(Citrus implementation for Ruby)制作bbcode解析器,我被困在解析这个[b]sometext[anothertext[/b]上了

有代码

代码语言:javascript
运行
复制
grammar BBCodeParser
  rule document
    (open_tag | close_tag | new_line | text)*
  end
  rule open_tag
    ("[" tag_name "="? tag_data? "]")
  end

  rule close_tag
    ("[/" tag_name "]") 
  end

  rule text
    [^\n\[\]]+
  end

  rule new_line
    ("\r\n" | "\n")
  end

  rule tag_name
    # [p|br|b|i|u|hr|code|quote|list|url|img|\*|color]
    [a-zA-Z\*]+
  end

  rule tag_data
    ([^\[\]\n])+
  end
end

问题是规则text我不知道怎么说,文本可以包含除\r、\n、open_tag或close_tag之外的所有内容。在此实现中,由于排除了 and ,因此在示例中失败

所以最后一个问题是如何执行规则,它可以匹配除\r、\n之外的任何内容,也可以与open_tag或close_tag完全匹配

如果你有另一个PEG实现的解决方案,也可以在那里给出。我可以切换:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-24 05:12:10

不久前我也遇到过类似的问题。要做到这一点,有一个技巧:

您需要说match open_tag,然后是不是结束标记的所有内容,然后是closing_tag。因此,这给出了以下规则

代码语言:javascript
运行
复制
rule tag
  open_tag ((!open_tag | !close_tag | !new_line ) .)+ close_tag
end
票数 0
EN

Stack Overflow用户

发布于 2011-09-20 00:00:23

这将解析任何文本,并在[不是另一个标记的开头时递归地继续。

代码语言:javascript
运行
复制
rule text
    [^\n\[\]]+ (!open_tag text)?
end
票数 0
EN

Stack Overflow用户

发布于 2011-09-20 04:57:06

代码语言:javascript
运行
复制
rule text
    [^\n\[\]]+ (!open_tag text)?
end

以解析错误结束

我试图继续这个想法,结果是([^\n] (!open_tag | !close_tag) text*),但它也会失败。它将与"sometext[anothertext[/b]"匹配

Find temp solution ((!open_tag | !close_tag | !new_line) .)它将只查找一个字母,但忽略所有的开始和结束标记。这些字母我稍后可以连接在一起:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7473570

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档