تحليل BBCode مع XSLT 2.0
سؤال
أحتاج إلى مساعدة في العثور على حل قابل للتطبيق لتحويل 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>
المحلول
أعتقد أن نهج أكثر قابلية للتطبيق سيكون للمطابقة ومرارا وتكرارا (عبر Regex) أزواج علامات BBCode، حتى لا تحصل على مباريات. على سبيل المثال [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 مكونا من XML، ثم أعالجه باستخدام XSL.
لا تنتمي إلى StackOverflow