【问题标题】:PHP Match Multipline Line with RegexPHP匹配多行行与正则表达式
【发布时间】:2014-02-10 14:27:13
【问题描述】:

我正在尝试使用 PHP 中的正则表达式匹配文档的多行。我知道 \s 选项,但不知何故我无法找出正确的正则表达式(使用在线正则表达式测试工具)。

该文件是一个 iCal 文件,如下所示:

BEGIN:VEVENT
LAST-MODIFIED:20140203T092537Z
CREATED:20140101T161157Z
DTSTART:20140220T150000Z
DTSTAMP:20140203T092537Z
DTEND:20140220T170000Z
SUMMARY:Summary of Event
UID:appointment_27140
END:VEVENT
BEGIN:VEVENT
LAST-MODIFIED:20140203T092537Z
CREATED:20140101T161157Z
DTSTART:20140221T070000Z
DTSTAMP:20140203T092537Z
DTEND:20140221T130000Z
SUMMARY:Event 2
UID:appointment_27135
LOCATION:TINF11B2
END:VEVENT

如果事件摘要中包含某些关键字,我想匹配整个事件(从 BEGIN:EVENT 到 END:EVENT)。

我认为匹配上述 iCal 中第二个事件的正则表达式看起来类似于:

/BEGIN:VEVENT(.*)Event 2(.*)END:VEVENT/s

【问题讨论】:

  • 为什么不使用 iCal 解析器或类,以便您可以直接使用您感兴趣的领域?
  • 这只是一个小的 php 脚本,它修复了我的大学日历中的一个错误。有了这个扩展,它还应该能够过滤掉某些讲座。它实际上只是删除了原始 iCal 中的几个事件。我认为不需要使用 iCal 解析器,因为我并没有真正尝试从 iCal 中获取信息/大量修改 iCal

标签: php regex


【解决方案1】:
(BEGIN:VEVENT(?:(?!BEGIN:VEVENT).)*Event 2.*?END:VEVENT)
  1. 捕获整个事件文本
  2. 匹配字符串“BEGIN:VEVENT”,
  3. 吃饱了,不要捕捉零个或多个非前瞻字符“BEGIN:VEVENT”,
  4. 匹配字符串“事件 2”,
  5. 不贪婪地吃掉零个或多个字符,
  6. 匹配字符串“END:VEVENT”

正则表达式演示: http://regex101.com/r/aK6lR4

PHP 代码:

//$events contains the file text
$search = 'Event 2';
$matches = array();
$found = preg_match('/BEGIN:VEVENT(?:(?!BEGIN:VEVENT).)*' . $search . '.*?END:VEVENT/s', $events, $matches);
if ($found === 1) {
    echo $matches[0];
}

或者,您可以使用 preg_match_all 匹配多个事件。 $matches[0] 将是一个数组而不是一个字符串,$found 将包含匹配的数量。

【讨论】:

    【解决方案2】:

    一种方法:

    $kw = 'Event 2';
    
    $pattern = sprintf('~BEGIN:([^\r\n]+)\R((?>[^E%s]++|\B[E%s]|(?!END:\1)%s(?!%s)|(?!%s)E(?!ND:\1))+)%s(?2)END:\1~',
                      $kw[0], $kw[0], $kw[0], substr($kw,1), $kw, $kw);
    
    preg_match_all($pattern, $iCalContent, $matches);
    
    print_r($matches[0]);
    

    【讨论】:

      【解决方案3】:

      【讨论】:

      • 没错,但有一个better answer right here。具体来说,您可以使用. 而不是[\s\S],它应该在前瞻之后,而不是之前。
      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 1970-01-01
      • 2015-12-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多