Php 当存在';混合内容

Php 当存在';混合内容,php,simplexml,Php,Simplexml,我在这里读过几个问题,这些问题似乎与我所面临的问题有关(直接或间接),但到目前为止,没有一个问题能满足我的具体需求,因此我想我会解释一下我的情况,看看我们是否能一起找到答案 我有一个XML类别的数据库(特别是AIML),我想使用simpleXML函数来解析它,以获得合适的输出。此解析输出是从所选类别内的标记处理的。一个简单的示例类别如下所示: <category> <pattern>HOW ARE YOU</pattern> <templ

我在这里读过几个问题,这些问题似乎与我所面临的问题有关(直接或间接),但到目前为止,没有一个问题能满足我的具体需求,因此我想我会解释一下我的情况,看看我们是否能一起找到答案

我有一个XML类别的数据库(特别是AIML),我想使用simpleXML函数来解析它,以获得合适的输出。此解析输出是从所选类别内的标记处理的。一个简单的示例类别如下所示:

<category>  
  <pattern>HOW ARE YOU</pattern>  
  <template>I am fine, how are you?</template> 
</category>

你好吗
我很好,你好吗?
如上所示,上面显示的标记可以保存文本,也可以单独保存一个或多个任意数量的不同AIML标记,也可以散布文本。这种可能性几乎是无穷无尽的。下面是一个更复杂的示例:

<category>
  <pattern>NESTED RANDOM TEST</pattern>
  <template>
    <random>
      <li>
        <random>
          <li>Choice #1-1</li>
          <li>Choice #1-2</li>
          <li>Choice #1-3</li>
        </random>
      </li>
      <li>
        This is some example text, along with another RANDOM tag:
        <random>
          <li>Choice #2-1</li>
          <li>Choice #2-2</li>
          <li>Choice #2-3</li>
        </random>
      </li>
      <li>
        <random>
          <li>Choice #3-1</li>
          <li>Choice #3-2</li>
          <li>Choice #3-3</li>
        </random>
        This is some text that appears [i]after[/i] a RANDOM tag.
      </li>
    </random>
  </template>
</category>

嵌套随机试验
  • 选择#1-1
  • 选择#1-2
  • 选择#1-3
  • 这是一些示例文本,以及另一个随机标记:
  • 选择#2-1
  • 选择#2-2
  • 选择#2-3
  • 选择#3-1
  • 选择#3-2
  • 选择#3-3
  • 这是在一个随机标记之后出现的一些文本。
    如果模板标记只包含文本,或者如果它只包含其他AIML标记,我在解析它的内容方面没有问题,但是如果它包含文本和标记的组合,就像上面示例的第二和第三个外部
  • 部分一样,如果前面有文本,我会丢失标记,或者如果前面有标记,我会丢失文本。无论标记中的文本有多“深”或“浅”,都会出现此问题。因此,我这里有一点问题

    正如我已经提到的,我已经读过几个这种性质的问题,到目前为止我还没有找到一个令人满意的答案。然而,我怀疑这可能是因为我没有完全理解其中的一些概念,因此可能没有正确地实施一些解决方案。例如,提到使用xslt“预处理”xml,这似乎可以解决我的问题,但我完全不知道如何实现这一点。另外,我没有使用xStream,所以我甚至不知道这是否是我可以实现的。恐怕我从未接受过PHP方面的正式培训,因此我的经验有点参差不齐


    我希望我已经提供了足够的信息,可以清楚地了解我的情况,而不会过于“罗嗦”。

    虽然这可能不是解决我问题的最佳方法,但我已经找到了一种相当简单(至少对我来说)优雅的方法,通过使用preg_replace()来处理我的问题将任何纯文本实例包含在标记中的XML字符串中。以下是我的想法:

    //首先,一些简单的混合内容XML:
    $myTemplate='您好。很高兴认识你;
    
    $myTemplate=preg_replace('~>(.*)$1虽然提出的答案确实很聪明,但我发现自己完全放弃了SimpleXML,而是使用PHP的内置功能。它支持将裸体文本内容公开为自己的离散节点的类和方法。

    正确的解决方案可能是递归的。然而,“实际上是无止境的”可能会产生几乎无穷无尽的解决方案。通过解析上述XML,您到底想得到什么作为输出?@nickb我试图实现的代码是一个名为Program O的聊天机器人引擎,它使用AIML类别数据库根据用户的输入生成响应。模板标记是从da返回的tabase,用于在找到“最佳匹配”后进行分析。模板标记可以包含文本,也可以包含十几个或更多不同的其他标记中的任何一个,这些标记指示解析器如何处理输出。有关所使用的各种标记的列表,请参阅。{continued}一般来说,模板将使用标签和纯文本的混合,没有特定的顺序。所需的最终输出将是XHTML,输出到web浏览器。创建递归解决方案的想法并不困扰我。我也很怀疑。:)这将是一个很好的回复,而不是一个答案