【问题标题】:Alternative regex to get contents for a xml tag获取 xml 标记内容的替代正则表达式
【发布时间】:2014-01-22 02:52:07
【问题描述】:

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

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

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

&lt;section&gt; 标签内的代码相当复杂。它包括数学方程式和类似的东西。 在我的本地机器上,正则表达式完美运行。 它是 apache 2.2.22 (Ubuntu) 之上的 php 5.3.10

但是在我的登台服务器中不起作用。 它是 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 由两个&lt;sections&gt; 组成。每个部分对考试的 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,则很难再次为方程式创建字符串并将其定位在问题陈述中的正确位置。

【问题讨论】:

  • 为什么不使用 xml 解析器?使用正则表达式解析 XML 存在一些问题,例如,sanity
  • 由于未转义的分隔符,手头的代码在任何一个版本上都不起作用。
  • 另外,你打扰reading the documentation了吗?您似乎错过了 PHP 5.3.6 的一个特定点。
  • 它在 PHP 5.3.3 no 5.3.6 上失败。我的第一种方法是使用解析器,但在这些部分中有很多代码我需要保留为 XML,因为它将由 jQuery 插件解释以呈现数学方程式。

标签: php regex xml-parsing


【解决方案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);
?>

【讨论】:

  • 感谢@flauntster。我编辑了问题以回答为什么我不能使用解析器。
【解决方案2】:

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

您的 XML 文档是否很可能包含换行符?你是否意识到. 字符将匹配所有除了换行符,除非你明确打开此功能?

试试这个:

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

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

但老实说,很多人都过于执着于“不使用正则表达式解析 XML”,而没有真正思考为什么这是一个坏主意。抛开性能不谈,本质上是因为没有适当的方法来处理嵌套标签——还有更多的事情要做,但这基本上就是归结为的。 XML 文档不是正则的,因此您不能使用正则表达式来解析它们。

但是!有时,您想从 XML 文档中获取的数据肯定是有规律的。如果您暂时抛开您正在处理 XML 的事实并将其仅视为一串文本 - 您可以建立明确的模式,您绝对可以使用正则表达式提取出来。

在您的情况下,我认为您的 XML 文档具有扁平结构是安全的选择;例如,不会有嵌套在其他标签内的标签。在这种情况下,如果我们忘记了 XML 组件,只考虑你所拥有的模式

  • 文本不匹配
  • 表示比赛开始的模式
  • 匹配的文本
  • 表示比赛结束的模式
  • 文本不匹配
  • 等等...

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

【讨论】:

  • 谢谢伙计。我编辑了问题以包括我已经尝试过的正则表达式的变体以及为什么我需要使用正则表达式而不是解析器。
猜你喜欢
  • 2014-10-28
  • 2012-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 2015-02-08
  • 2018-01-07
  • 2011-10-21
相关资源
最近更新 更多