我正在慢慢拼凑一个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>";
}
关于我哪里出错的任何建议?
答案 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];
}
谢谢你们!