使用PHP中的正则表达式解析soundcloud“/ sets /”url

时间:2014-05-31 05:53:41

标签: php regex

我尝试使用正则表达式将soundcloud解析为从链接中提取的嵌入代码

如果我把这个url:https://soundcloud.com/theredrojomusic/animal首先转换为链接,然后更改为嵌入代码(使用vimeo / youtube / metacafe正则表达式),就这么远了:

array(
   'https{0,1}:\/\/w{0,3}\.*soundcloud\.com\/([A-Za-z0-9_-]+)\/([A-Za-z0-9_-]+)[^< ]*',
   '<iframe width="100%" height="'.$s.'" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=http://soundcloud.com/$1/$2&amp;auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&visual=false"></iframe>')

问题是当我尝试解析像https://soundcloud.com/theredrojomusic/sets/tristezza

这样的集合时

这只是将网址呈现为https://soundcloud.com/theredrojomusic/sets,而嵌入代码无法处理。

我试过了:

array(
    'https{0,1}:\/\/w{0,3}\.*soundcloud\.com\/([A-Za-z0-9_-])\/sets\/*([A-Za-z0-9_-]+)[^< ]*',
    '<iframe width="100%" height="'.$s.'" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=http://soundcloud.com/$1/sets/$2&amp;auto_play=false&hide_related=true&show_comments=false&show_user=true&show_reposts=false&visual=false"></iframe>'), 

但是呈现的网址有https://soundcloud.com/c/sets/tristezza

我想有两个正则表达式,一个用于非/sets/网址,另一个用于/sets/,因为嵌入代码有点不同(至少如果我想要/sets/一个看起来像一个列表,而不仅仅是一首歌。)

我真的很难用正则表达式...有人能指出我正确的方向吗?

由于

1 个答案:

答案 0 :(得分:2)

第一个正则表达式是

https{0,1}:\/\/w{0,3}\.*soundcloud\.com\/([A-Za-z0-9_-]+)\/([A-Za-z0-9_-]+)[^< ]*

并且在soundcloud\.com之后有两个正斜杠后跟字母数字序列。因此它可以匹配soundcloud.com/wordOne/wordTwo。未匹配的集合(即https://soundcloud.com/theredrojomusic/sets/tristezza)看起来像soundcloud.com/wordOne/wordTwo/wordThree

这两个示例没有显示所需文本后面的字符,但是第一个正则表达式的最后一部分是[^< ]*,它没有做任何有用的事情。它表示寻找零个或多个不是左前卫或空间的角色,但它对它们没有任何作用。假设左V形或空格标记了所需文本的结尾,那么将正则表达式更改为

https{0,1}:\/\/w{0,3}\.*soundcloud\.com\/([A-Za-z0-9_-\/]+)[< ]

甚至

https{0,1}:\/\/w{0,3}\.*soundcloud\.com\/([^< ]+)[< ]

首先查看任何序列的字母数字加上正斜线,然后是左V形或空格。第二个查找除左V形或空格之外的任何字符序列。如果没有更准确的说明需要什么,很难说正则表达式是什么。

稍后在代码的两个部分中都有一个src=...子句。其中有一个$1/$2,需要更改为$1

更新

要匹配包含和不包含/sets/的字符串,我建议使用上面给出的表达式来查找这两个版本。然后使用if语句检查匹配的文本是否包含/sets/