0

我正在尝试编写一个函数来从 Facebook 获取用户个人资料 ID 或用户名。他们在表单中输入 url,然后我试图确定它是 Facebook 个人资料页面还是其他页面。问题是,如果他们进入具有子域的应用页面或其他页面,我想忽略该请求。

现在我有:

    $author_url = http://facebook.com/profile?id=12345;
            if(preg_match("/facebook/i",$author_url)){
            $parse_author_url = (parse_url($author_url));
            $parse_author_url_q = $parse_author_url['query'];
                if(preg_match('/id[=]([0-9]*)/', $parse_author_url_q, $match)){
                    $fb_id = "/".$match[1];}
                else{ $fb_id = $parse_author_url['path'];
                }
            $grav_url= "http://graph.facebook.com".$fb_id."/picture?type=square";
}
echo $gav_url;

如果$author_url有“id=”,则此方法有效,然后将其用作配置文件 ID,如果没有,则它必须是用户名或页面名称,因此请改用它。我需要再运行一次检查,如果 url 包含 facebook 但它是一个子域,请忽略它。我相信我可以在第一个 preg_match 中做到这一点preg_match("/facebook/i",$author_url)

谢谢!

4

2 回答 2

1

要忽略 facebook 子域,您可以确保

$parse_author_url['host']

facebook.com

如果它有其他类似的东西,login.facebook.com或者apps.facebook.com你不需要继续。

或者,您还可以确保 URL 开头http://facebook.com为:

if(preg_match("@(?:http://)?facebook@i",$author_url)){
于 2010-09-17T02:38:55.237 回答
0

这不是您所要求的直接解决方案,但这些部件在这里可以完成您需要做的事情。

我发现子域导致parse_url出现问题。也就是说,它返回了一个只有$result['path']而没有'host' 或 'scheme'的数组。

我的理论是,如果parse_url没有“主机”或“方案”结果,并且字符串中有域后缀( .ext ),那么它就是一个子域。

这是代码:( $src 是我必须从子域中整理出相对 src 的 url):

$srcA = parse_url( $src );
//..if no scheme or host test if subdomain.
if( !$srcA['scheme'] && !$srcA['host'] ){
    //..this string / array is set elsewhere but for this example I will put it here
    $tld = "AC,AD,AE,AERO,AF,AG,AI,AL,AM,AN,AO,AQ,AR,ARPA,AS,ASIA,AT,AU,AW,AX,AZ,BA,BB,BD,BE,BF,BG,BH,BI,BIZ,BJ,BM,BN,BO,BR,BS,BT,BV,BW,BY,BZ,CA,CAT,CC,CD,CF,CG,CH,CI,CK,CL,CM,CN,CO,COM,COOP,CR,CU,CV,CW,CX,CY,CZ,DE,DJ,DK,DM,DO,DZ,EC,EDU,EE,EG,ER,ES,ET,EU,FI,FJ,FK,FM,FO,FR,GA,GB,GD,GE,GF,GG,GH,GI,GL,GM,GN,GOV,GP,GQ,GR,GS,GT,GU,GW,GY,HK,HM,HN,HR,HT,HU,ID,IE,IL,IM,IN,INFO,INT,IO,IQ,IR,IS,IT,JE,JM,JO,JOBS,JP,KE,KG,KH,KI,KM,KN,KP,KR,KW,KY,KZ,LA,LB,LC,LI,LK,LR,LS,LT,LU,LV,LY,MA,MC,MD,ME,MG,MH,MIL,MK,ML,MM,MN,MO,MOBI,MP,MQ,MR,MS,MT,MU,MUSEUM,MV,MW,MX,MY,MZ,NA,NAME,NC,NE,NET,NF,NG,NI,NL,NO,NP,NR,NU,NZ,OM,ORG,PA,PE,PF,PG,PH,PK,PL,PM,PN,POST,PR,PRO,PS,PT,PW,PY,QA,RE,RO,RS,RU,RW,SA,SB,SC,SD,SE,SG,SH,SI,SJ,SK,SL,SM,SN,SO,SR,ST,SU,SV,SX,SY,SZ,TC,TD,TEL,TF,TG,TH,TJ,TK,TL,TM,TN,TO,TP,TR,TRAVEL,TT,TV,TW,TZ,UA,UG,UK,US,UY,UZ,VA,VC,VE,VG,VI,VN,VU,WF,WS,XXX,YE,YT,ZA,ZM,ZW";

    $tldA = explode( ',' , strtolower( $tld ) );

    $isSubdomain = false;
    foreach( $tldA as $tld ){
        if( strstr( $src , '.'.$tld)!=false){
            $isSubdomain = true;
            break;
        }            
    }
    //..prefixing with the $host if it is not a subdomain.
    $src = $isSubdomain ? $src : $src = $host . '/' . $srcA['path'];

}

可以通过在第一个“/”之前解析 subdomain==true 字符串并使用正则表达式测试字符来进一步确认。

希望这可以帮助一些人。

于 2013-06-26T22:12:15.613 回答