如何正确匹配以下文本?
$string = "(''streamer'',''http://dv_fs06.ovfile.com:182/d/pftume4ksnroarhlslexwl7bcnoqyljeudgmd7dimssniu2b2r2ikr2h/video.flv'')";
preg_match("/streamer'''',''''(.*?)''''')/", $string , $result);
var_dump($result);
您的$字符串看起来很奇怪。最好使用三次解析:
$string = str_replace(array("''"), '', $string);
现在我们有了string:
"(streamer,http://dv_fs06.ovfile.com:182/d/pftume4ksnroarhlslexwl7bcnoqyljeudgmd7dimssniu2b2r2ikr2h/video.flv)"
现在让我们修改括号:
$string = trim($string, '()');
最后,爆炸:
list($streamer, $url) = explode(',', $string, 2);
不需要正则表达式
顺便说一句,你的字符串看起来像是在mysql查询中被很糟糕地削减了。
距离我上次在PHP中做regexp匹配已经有一段时间了,但我认为你必须记住:
- '在PHP字符串中不需要转义" "
- '总是需要在PHP字符串中转义
- '需要在regexp中再转义一次(因为它是一个特殊字符,您希望将其视为正常字符)
=> '作为要匹配的字符串的一部分必须转义4次。
我的建议:
preg_match("/''(streamer''''','''''(.*?)''''''')/", $string , $result);
你做对了。需要克服的两个障碍(正如codethief所说):
1 -双引号字符串插值
2 - Regex转义插值
对于(2),逗号和引号都不需要转义,因为它们不是元字符
对于正则表达式来说是特殊的。只有作为文字的反斜杠需要转义,否则
在正则表达式上下文中,它表示元字符序列的开始(如's
)。
For (1), php将尝试插入转义字符作为控制代码(如'n
),对于
因此需要转义字面反斜杠。由于这是双引号,''
转义单引号没有转义意义。
因此,"''''"
解析为''
= '
+ ''
= ''
~ '''
,这是正则表达式看到的。然后regex将序列/'''/
插入为字面量'
+ '
。
稍微改变一下正则表达式就可以解决这个问题:preg_match("/streamer'''',''''(.*?)''''')/", $string , $result);
这里有一个工作示例http://beta.ideone.com/47EIY