【问题标题】:Parsing complex string in PHP在 PHP 中解析复杂的字符串
【发布时间】:2012-02-28 13:01:43
【问题描述】:

我需要帮助来解析一个字符串。

字符串是:

DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**

(我需要的变量两边都有**)

我需要将粗体的值分配给以下变量(以相同的顺序):

$startdate 
$frequency
$interval
$enddate

感谢所有帮助。谢谢!

编辑:实际的字符串是:

DTSTART;VALUE=DATE:20120201 DTEND;VALUE=DATE:20120202 RRULE:FREQ=DAILY;INTERVAL=2;UNTIL= 20120331

我只在变量的两侧添加了 ** 以显示我想要的变量(因为粗体突出显示在代码 sn-p 中不起作用)

【问题讨论】:

标签: php string parsing


【解决方案1】:

你可以这样做:

<?php
$s = "DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**";

preg_match(
    '/^DTSTART;VALUE=DATE:\*\*(\d+)\*\*\s+DTEND;VALUE=DATE:(\d+)\s+RRULE:FREQ=\*\*(\w+)\*\*;INTERVAL=\*\*(\d+)\*\*;UNTIL=\*\*(\d+)\*\*/',
    $s,
    $matches
);

print_r($matches);
?>

--8

php file.php

Array
(
    [0] => DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**
    [1] => 20120201
    [2] => 20120202
    [3] => DAILY
    [4] => 2
    [5] => 20120331
)

【讨论】:

  • 您好,谢谢您的回复。我应该说变量两侧的 ** 是我添加的,以突出显示我想要的变量。字符串实际上不是那样的。
  • 不,你 can't 这样做。例如,“;VALUE=DATE”和“INTERVAL”部分是可选的。
【解决方案2】:

看看这个 PHP 类:http://code.google.com/p/ics-parser/

它将 iCal 字符串转换为数组,因此非常容易处理。

Array
(
    [0] => Array
        (
            [DTSTART] => 20110105T090000Z
            [DTEND] => 20110107T173000Z
            [DTSTAMP] => 20110121T195741Z
            [UID] => 15lc1nvupht8dtfiptenljoiv4@google.com
            [CREATED] => 20110121T195616Z
            [DESCRIPTION] => This is a short description\nwith a new line. Some "special" 'signs' may be <interesting>\, too.
            [LAST-MODIFIED] => 20110121T195729Z
            [LOCATION] => Kansas
            [SEQUENCE] => 2
            [STATUS] => CONFIRMED
            [SUMMARY] => My Holidays
            [TRANSP] => TRANSPARENT
        )
)

【讨论】:

  • 即使缺少某些信息,这项工作是否可行?我的日历活动没有位置或摘要信息。
  • 是的,它仍然可以工作,但位置或摘要不会在数组中。使用预制课程几乎总是解决此类问题的最佳途径。我以前用过这个,不能出错。我应该提到你可以在这里下载它:code.google.com/p/ics-parser/source/browse/#svn%2Ftrunk
【解决方案3】:

如果您需要的值在 ** 范围内,您可以使用 explode(string,'**') 并且可以使用备用数组值

【讨论】:

  • 哦,抱歉,实际的字符串不包含变量,我这样做只是为了突出显示我想要的字符串。
【解决方案4】:

在下面的例子中,我分解你的字符串并做一些正则表达式和字符串替换.. 可能有更好的方法,因为我不是正则表达式专家,但这应该可行!

$teststr="DTSTART;VALUE=DATE:**20120201** DTEND;VALUE=DATE:20120202 RRULE:FREQ=**DAILY**;INTERVAL=**2**;UNTIL=**20120331**";
$array=explode(";",$teststr);

preg_match("/\*(.*)\*/", $array[1], $matches);
$startdate = str_replace("*", "", $matches[1]);
echo "Startdate:". $startdate ."<br>\n";

preg_match("/\*(.*)\*/", $array[2], $matches);
$frequency = str_replace("*", "", $matches[1]);
echo "Frequency:". $frequency ."<br>\n";

preg_match("/\*(.*)\*/", $array[3], $matches);
$interval = str_replace("*", "", $matches[1]);
echo "Interval:". $interval  ."<br>\n";

preg_match("/\*(.*)\*/", $array[4], $matches);
$enddate = str_replace("*", "", $matches[1]);
echo "Enddate:" . $enddate ."<br>\n";

【讨论】:

  • 感谢您的回复。我已经更新了我的问题,因为我没有正确解释它。如果您能阅读并提供另一个答案,我将不胜感激。
猜你喜欢
  • 2016-06-20
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
相关资源
最近更新 更多