替代正则表达式获取xml标记的内容

时间:2014-01-22 02:52:08

标签: php regex xml-parsing

我正在处理XML文件,我需要在<section>标记内获取所有内容。

现在我正在使用这个正则表达式:

<?php preg_match_all('/<section[^>]*>(.*?)<\/section>/i', $myXmlString, $results);?>

<section>标记内的代码非常复杂。它包括数学方程式和类似的东西。 在我的本地机器上,正则表达式非常完美。 它是php 5.3.10 over apache 2.2.22(Ubuntu)

我的登台服务器中的

不起作用。 这是apache 2.2.15(Red Hat)的php 5.3.3

我会问两个问题:

php 5.3.3的preg_match_all有什么问题吗?

有没有更好的方法来表达正则表达式?

- 编辑:不成功使用的各种变化 -

<?php preg_match_all('/<section[^>]*>(.*?)<\/section>/is', $myXmlString, $results);?>
<?php preg_match_all('/<section[^>]*>(.*?)<\/section>/ims', $myXmlString, $results);?>
<?php preg_match_all('#<section[^>]*>(.*?)<\/section>#ims', $myXmlString, $results);?>
<?php preg_match_all('#<section[^>]*>([^\00]*?)<\/section>#ims', $myXmlString, $results);?>

- 编辑:为什么我没有使用解析器?

XML由两个<sections>组成。每个部分都会为考试提供 n 问题。

每个问题都可以包含由其自己的XML表示的数学方程式。等式可能是这样的:

<inlineequation><m:math baseline="-16.5" display="inline" overflow="scroll"><m:mrow><m:mtable columnalign="left"><m:mtr><m:mtd><m:mrow><m:mo stretchy="true">[</m:mo><m:mrow><m:mtable columnalign="right"><m:mtr><m:mtd><m:mn>4</m:mn></m:mtd><m:mtd columnalign="right"><m:mrow><m:mo>-</m:mo><m:mn>9</m:mn></m:mrow></m:mtd><m:mtd columnalign="right"><m:mrow><m:mn>54</m:mn></m:mrow></m:mtd></m:mtr><m:mtr><m:mtd columnalign="right"><m:mrow><m:mo>&minus;</m:mo><m:mn>28</m:mn></m:mrow></m:mtd><m:mtd columnalign="right"><m:mo>&minus;</m:mo><m:mn>1</m:mn></m:mtd><m:mtd columnalign="right"><m:mo>&minus;</m:mo><m:mn>14</m:mn></m:mtd></m:mtr></m:mtable></m:mrow><m:mo stretchy="true">]</m:mo></m:mrow></m:mtd></m:mtr></m:mtable></m:mrow></m:math></inlineequation>

我需要该代码保持XML(没有数组),因为我会将该代码传递给jQuery插件,该插件将呈现等式(它看起来像LaTeX等式)。

如果我解析XML,那么再次为方程创建字符串并在问题陈述中的正确位置找到它真的很困难。

2 个答案:

答案 0 :(得分:1)

正则表达式可能是资源密集型的。

或许考虑使用xml_parse_into_struct;

<?php
    $xmlp = xml_parser_create();
    xml_parse_into_struct($xmlp, $myXmlString, $vals, $index);
    xml_parser_free($xmlp);
    print_r($vals);
?>

答案 1 :(得分:0)

正如其他人所说,不要使用正则表达式来解析XML。话虽如此,让我们回答你的实际问题:

您的XML文档是否包含换行符?您是否意识到除非明确启用此功能,否则.字符将匹配换行符之外的所有字符?

试试这个:

<?php preg_match_all('/<section[^>]*>(.*?)<\/section>/si', $myXmlString, $results);?>

最后的额外s告诉正则表达式引擎允许.匹配换行符。

老实说,很多人对“不使用正则表达式解析XML”感到太过沉溺,而没有真正考虑为什么这是一个坏主意。除了性能之外,它主要是因为没有适当的方法来处理嵌套标签 - 除此之外还有更多,但这基本上归结为它。 XML文档不是常规的,因此您无法使用正则表达式来解析它们。

无论其!有时,您希望从XML文档中获取的数据肯定是常规的。如果你丢弃了一段时间处理XML并将其视为一串文本的事实 - 你可以建立明确的模式,你绝对可以使用正则表达式来提取。

在你的情况下,我会说你的XML文档结构扁平是安全的。例如,没有嵌套在其他标签内的标签。在这种情况下,如果我们忘记了XML组件,只考虑你已经拥有的模式

  • 无与伦比的文字
  • 表示比赛开始的模式
  • 匹配文字
  • 表示比赛结束的Patten
  • 无与伦比的文字
  • 等...

这是绝对规律的 - 除了一些疯狂的边缘情况,我不会担心 - 它非常安全!