题
我需要帮助找到一个可行的解决方案的bbcode转换为HTML,这正是香港专业教育学院走了这么远,但是当bbcodes得到包裹失败。
的Src:
[quote id="ohoh81"]asdasda
[quote id="ohoh80"]adsad
[quote id="ohoh79"]asdad[/quote]
[/quote]
[/quote]
代码:
<xsl:variable name="rules">
<code check="
" ><br/></code>
<code check="\[(quote)(.*)\]" ><span class="quote"></code>
</xsl:variable>
<xsl:template match="text()" mode="BBCODE">
<xsl:call-template name="REPLACE_EM_ALL">
<xsl:with-param name="text" select="." />
<xsl:with-param name="pos" select="number(1)" />
</xsl:call-template>
</xsl:template>
<xsl:template name="REPLACE_EM_ALL">
<xsl:param name="text" />
<xsl:param name="pos" />
<xsl:variable name="newText" select="replace($text, ($rules/code[$pos]/@check), ($rules/code[$pos]))" />
<xsl:choose>
<xsl:when test="$rules/code[$pos +1]">
<xsl:call-template name="REPLACE_EM_ALL">
<xsl:with-param name="text" select="$newText" />
<xsl:with-param name="pos" select="$pos+1" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of disable-output-escaping="yes" select="$newText" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
解决方案
我觉得更可行的办法是反复地匹配和替换(通过正则表达式)UBB标签的的对的,直到你没有比赛。例如。为[quote]
和[url]
:
<xsl:function name="my:bbcode-to-xhtml" as="node()*">
<xsl:param name="bbcode" as="xs:string"/>
<xsl:analyze-string select="$bbcode" regex="(\[quote\](.*)\[/quote\])|(\[url=(.*?)\](.*)\[/url\])" flags="s">
<xsl:matching-substring>
<xsl:choose>
<xsl:when test="regex-group(1)"> <!-- [quote] -->
<span class="quote">
<xsl:value-of select="my:bbcode-to-xhtml(regex-group(2))"/>
</span>
</xsl:when>
<xsl:when test="regex-group(3)"> <!-- [url] -->
<a href="regex-group(4)">
<xsl:value-of select="my:bbcode-to-xhtml(regex-group(5))"/>
</a>
</xsl:when>
</xsl:choose>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:function>
其他提示
这可能是一个坏主意,因为XSLT是设计来处理格式良好的XML,而不是任意的文本。我建议你预处理的BBCode先用<
和>
更换左,右括号,你需要什么别的,使其形成良好的XML,然后用XSL处理它。
不隶属于 StackOverflow