有没有更快/更好的方法,而不是在下面的代码中使用preg_match?

时间:2011-07-22 10:27:28

标签: php xml simplexml

  

可能重复:
  How can I edit my code to echo the data of child's element where my search term was found in, in XMLReader?

此代码查找<date_iso></date_iso>中是否存在字符串2004,如果是,则会回显搜索字符串所在的特定元素中的一些数据。

我想知道这是否是最好/最快的方法,因为我主要关心的是速度和XML文件是巨大的。谢谢你的想法。

这是XML的一个示例

<entry ID="4406">
    <id>4406</id>
    <title>Book Look Back at 2002</title>
    <link>http://www.sebastian-bergmann.de/blog/archives/33_Book_Look_Back_at_2002.html</link>
    <description></description>
    <content_encoded></content_encoded>
    <dc_date>20.1.2003, 07:11</dc_date>
    <date_iso>2003-01-20T07:11</date_iso>
    <blog_link/>
    <blog_title/>
</entry>

这是代码

<?php
$books  = simplexml_load_file('planet.xml');
$search = '2004';
foreach ($books->entry as $entry) {
    if (preg_match('/' . preg_quote($search) . '/i', $entry->date_iso)) {
        echo $entry->dc_date;
    }
}
?>

这是另一种方法

<?php
$books  = simplexml_load_file('planet.xml');
$search = '2004';
$regex = '/' . preg_quote($search) . '/i';
foreach ($books->entry as $entry) {
    if (preg_match($regex, $entry->date_iso)) {
        echo $entry->dc_date;
    }
}
?>

2 个答案:

答案 0 :(得分:2)

如果你主要关心的是速度,你不应该为此使用simplexml或任何其他基于DOM的xml解析;使用基于SAX的解析器。此外,如果您只想进行简单的子串匹配(使用strpos),请不要使用preg_match。

如果速度不是你真正关心的问题,但是习惯是,使用XPath 2.0实现(不知道是否有一个用于PHP)或执行其他基于XPath的正则表达式匹配 - 快速谷歌显示exslt选项,或更简单的基于xpath 1.0的字符串匹配选项。

答案 1 :(得分:0)

preg_match是一个正则表达式函数,如果你只需要进行简单的字符串比较,通常建议不要使用正则表达式。

使用preg_match的替代方法是将<date-iso>内容的开头与年份进行比较:

if ($search === substr($entry->date_iso, 0, 4))

因为日期始终采用相同的格式(希望如此)并从年份开始。您还可以将-添加到搜索字符串中,然后与前5个字符进行比较。