preg_match(); - 未知修饰符 '+'

57

好的,我目前正在解析一个RSS feed。 我已经很顺利地获取了所需的数据,现在只剩下解析游戏标题。

以下是我目前拥有的代码(请忽略它的凌乱,它只是一个概念验证):

<?php
$url = 'http://raptr.com/conexion/rss';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$result = curl_exec($ch); 
curl_close($ch);

$xml = new SimpleXMLElement($result);

$lastgame = $xml->channel->item[0]->description;
preg_match('[a-zA-Z]+</a>.$', $lastgame, $match);

echo $match;
?>

一切都顺利运行,但后来我开始遇到这个错误:

Warning: preg_match() [function.preg-match]: 
Unknown modifier '+' in raptr.php on line 14

我所剩下的就是去掉闭合锚点标签和句号,但我不知道为什么它不喜欢“+”。有任何想法吗?

编辑:这个问题在两年前就被提出,不应该标记为重复。


你想匹配什么?所有链接吗?那就试试 preg_match_all。否则可以尝试使用 RSS 解析器。 - mario
我只想要最近玩的游戏。它总是在第二个链接中的文本。我希望他们能更好地组织信息流。 - David Bradbury
使用 preg_match_all 并获取第二个条目。 - mario
@mario - 它有点起作用,但因为某种原因它返回了一个数组内的另一个数组 - Array ( [0] => Array ( [0] => Conexion [1] => Minecraft ) ) - David Bradbury
是的,这就是与普通的 preg_match 不同的地方,后者只会返回一个结果。 - mario
显示剩余2条评论
4个回答

70

在PHP中,使用正则表达式时需要使用分隔符。通常情况下可以使用斜杠 / 作为分隔符,但是PHP允许使用任何匹配字符,所以 @# 很受欢迎。

更多阅读.

如果您在正则表达式中插入变量,请确保将所选的分隔符作为第二个参数传递给 preg_quote()


2
哇,这真是个惊喜。string preg_quote ( string $str [, string $delimiter = NULL ] ) -> 函数签名默认不强制任何内容,因此在最不经意的时候让我感到非常痛苦。默认应该是 / - stamster

29

尝试使用这段代码:

preg_match('/[a-zA-Z]+<\/a>.$/', $lastgame, $match);
print_r($match);

使用/作为分隔符还意味着您需要在此处进行转义,就像这样:<\/a>。

更新

preg_match('/<a.*<a.*>(.*)</', $lastgame, $match);
echo'['.$match[1].']';

可能不是最好的方法...


print_r($match); 返回 "Array ( )" 我非常确定我的表达式是正确的。 - David Bradbury
我不知道你在评论中想要表达什么意思... - Khez
@Conexion,我看了你的其他评论,你想从那个RSS源中提取什么来匹配?游戏吗? - Khez
是的,只是尝试拉取最近的游戏 :) - David Bradbury
它能工作,但问题是,该源并不总是以“played some”开头。抱歉我有些困难! - David Bradbury
我再次更新了我的代码,这一次考虑到了你始终按照 <a>用户</a> <a>游戏</a> 的顺序。 - Khez

6

这种情况发生在我把一个变量放在正则表达式中,有时它的字符串值包含了斜杠。解决方案:使用preg_quote函数。


谢谢您告诉我 preg_quote - 非常有用的函数! - Shane N

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接