2016-03-26 28 views
1

的GIF ID我想一个PHP的正则表达式来从这些PHP的正则表达式得到giphy

http://i.giphy.com/VmzI60RQG0fuw.gif 
https://media.giphy.com/media/VmzI60RQG0fuw/giphy.gif 
http://giphy.com/gifs/VmzI60RQG0fuw 
http://giphy.com/gifs/music-videos-mariah-carey-dreamlover-VmzI60RQG0fuw 

我测试此提取ID(VmzI60RQG0fuw),但它不能在3概率工作

preg_match('~(media\.giphy\.com/media/([^ /]+)/giphy\.gif|i.giphy.com/([^ /]+).gif)~i', $this->url, $matches) 

回答

2

这里是一个应该工作:

'~https?://(?|media\.giphy\.com/media/([^ /]+)/giphy\.gif|i\.giphy\.com/([^ /]+)\.gif|giphy\.com/gifs/(?:.*-)?([^ /]+))~i' 

regex demo

第三种方法是giphy\.com/gifs/(?:.*-)?([^ /]+)

  • giphy\.com/gifs/ - 子路径giphy.com/gifs/
  • (?:.*-)? - (可选组,文本可能会丢失由于(?:...)?结构)直至最后-所有字符(匹配也许,替换为\S*-[^\s/]*-可以使它更精确一点)
  • ([^ /]+) - 匹配并捕获ID(一个或m个矿石字符以外的空格和/)。

由于它是针对PHP的,您还可以使用分支重置((?|...|...)),以便所有捕获的组可以具有一个相同的ID#1。

+0

请注意,如果独立分析URL,'。*'可以工作。如果它们在某些情况下出现,则需要用'\ S *'替换'。*',或者甚至可以用'[^ ​​\ s> /] *' –

+0

好,请添加这个http:// giphy。 com/gifs/VmzI60RQG0fuw –

+0

它是:['https?://(?| media \ .giphy \ .com/media /([^/\ n] +)/ giphy \ .gif | i \ .giphy \ .com /([^ /\n]+)\.gif|giphy\.com/gifs/(?:.*-)?([^/ \ n] +))'](https:// regex101。 COM/R/eC9gL6/3)。请注意''[']''里面的'\ n'是由于它是一个多行字符串演示而添加的,我不认为你需要它在真实的代码中。 –