使用Regex在给定单词之前搜索单词

时间:2014-08-29 11:03:53

标签: php regex search match icalendar

我正在慢慢拼凑一个class.iCalReader.php的实现,以获取一个iCal feed并生成一个表,其中包含特定日期在建筑物中发生的所有事件。作为其中的一部分,我需要提取事件将在哪个房间 - 这包含在iCal数组的“描述”字段中。

所以,我已经确定我需要使用正则表达式来查找“房间”这个词的描述,然后在“房间”之前返回这个词。然而,实际的正则表达式让我失望 - 我不是一个优秀的程序员。

目前我有:

function getRoom($description, $search = 'Room')
{

if (1 !== preg_match('#\s(\w+)\s+('.$search.')\s#i', $description, $matches)) return 'TBA';
return $matches[1];

}

我在函数调用中将变量$search设置为'Room'。可以有多个房间。

.ical流包含以下内容作为其“事件数组”的一部分:

DESCRIPTION:Event Type: Private\n\nRegistrations: 1 \n\nResources: Indian Room

一旦使用此行解析了class.iCalReader.php,我就会得到这个:

$description = $event['DESCRIPTION'];

稍后在我的php中,我将$ room设置为:

$room = getRoom($description);

然后,我尝试使用以下命令返回值:

if ($room !== FALSE) {
    echo "<td>". stripslashes($room) ."</td>";
} else {
    echo "<td>No Room Allocated</td>";
}

关于我哪里出错的任何建议?

3 个答案:

答案 0 :(得分:0)

请检查:http://regex101.com/r/jJ5mU7/3

你可能需要删除第一个#或者它是特定于php的东西吗?

你需要使用?=

前瞻

你需要非贪婪的匹配部分(有2个房间):+

之后的问号

更改为

if (1 !== preg_match('\s(\w+)\s+?(?='.$search.')\s', $description, $matches)) return 'TBA';

专注于?和?=

答案 1 :(得分:0)

试试这个:

'#\s(\w+)\s+('.$search.')\s#s'

  

&#39;#\ S(\ W +)\ S +(&#39; $搜索&#39;。)\ S#是&#39;

if ( preg_match('#\s(\w+)\s+('.$search.')\s#s', $description, $matches))
  return $matches[1];
else 
  return 'TBA';

答案 2 :(得分:0)

我已经设法在你的帮助下对它进行排序!它没有正确处理描述,但是,这已经成功了:

    function getRoom($description, $search = 'Room')
{
    $description .= ' ';
    if (1 !== preg_match('#\s((\w+)\s+Room)[\s.;]#i', $description, $matches)) return 'TBA';
    return $matches[1];
}

谢谢你们!