2013-08-21 51 views
0

我的文字是:PHP预浸匹配解析的东西,可能是YouTube网址

u0026itag=22\u0026url=http%3A%2F%2Fr5---sn-q4f7dnel.c.youtube.com\u0026sig 

我想分析u0026url 我的PHP代码:

preg_match('/u0026itag=22\u0026url=(.*?)/', $part, $A); 
echo $A[1]; 

但它不给我结果

+0

什么与编码 - 你有原始字符串? – SmokeyPHP

+1

实际定义了一个URL。在你的示例字符串中,确实没有单个URL。 – hakre

+0

原始字符串太长 –

回答

0

您是否尝试过使用贪婪匹配http://regex101.com/r/lT1wK5?请记住逃脱带有\ U还,否则你会得到

编译失败:PCRE不支持\ L,\ L,\ N {}名称,\ U,或带有\ U

例如:

$var = "u0026itag=22\u0026url=http%3A%2F%2Fr5---sn-q4f7dnel.c.youtube.com\u0026sig"; 

preg_match('/u0026itag=22\\\u0026url=(.*)/', $var, $A); 
echo $A[1]; 
1

首先一个提示:如果您enable errors, PHP tells you about what is going wrong。当我第一次复制你的代码时,我收到了以下警告:

警告:preg_match():编译失败:PCRE不支持\ L,\ l,\ N {name},\ U或\你在偏移量14

所以这已经是一个暗示,你逐字地放在那里的一些序列被解析为正则表达式,因此它需要转义或引用。我首选这里引用,即在\ Q开头和。\ E末(报价)包装:

$result = preg_match('/^\Qu0026itag=22\u0026url=\E(.*?)/', $subject, $matches); 
         ##      ## 

然后阻止看到一个错误,并转向$result为1,这意味着它的工作。但是你还没有看到任何组比赛1或更好的说你看到一个空的匹配:

[0] => string(22) "u0026itag=22\u0026url=" 
    [1] => string(0) "" 

那是因为你与明星变成了重复从贪婪到懒惰。让我们把它取而代之:

/^\Qu0026itag=22\u0026url=\E(.*+)/ 
           # plus means posessive 

    [1] => string(52) "http%3A%2F%2Fr5---sn-q4f7dnel.c.youtube.com\u0026sig" 

好吧,这看起来更好,它包含“网址”。这使我想到了一点:即使我向你解释了一些正则表达式(希望这给出了一些指针),但它实际上可能并不是首先使用的正确工具。

你在这里看起来像一些JSON字符串,确实包含一些URL编码的东西。

因此,我建议您首先使用json_decode解码JSON字符串,然后使用parse_url解析URL,然后您需要做的就是获取url查询参数。那是parse_str