【问题标题】:Regex to get instagram picture (PHP)正则表达式获取Instagram图片(PHP)
【发布时间】:2016-10-15 01:18:15
【问题描述】:

我正在尝试使用正则表达式来检查 URL 是否是 Instagram 图片并仅返回带有 /p/PICTUREID 的 URL 的开头部分

到目前为止,这是我能想到的:

^(.*instagram.com\/p\/.*)\/

然而,这需要有一个斜杠,但我不想要求它。

示例(应该匹配):

https://www.instagram.com/p/BKbwlrfjGHY/?post->
https://www.instagram.com/p/BKbwlrfjGHY

http://www.instagram.com/p/BKbwlrfjGHY/ ->
http://www.instagram.com/p/BKbwlrfjGHY

instagram.com/p/BKbwlrfjGHY ->
instagram.com/p/BKbwlrfjGHY

如果斜杠存在,我该如何在斜杠处停下来?

这是我用于测试的 regex101:

https://regex101.com/r/JJS2kz/1

【问题讨论】:

    标签: php regex


    【解决方案1】:

    解决方案 1

    您可以在此处使用此正则表达式来匹配您提供的所有示例:

    /(https?:\/\/www\.)?instagram\.com(\/p\/\w+\/?)/
    

    说明

    正则表达式的第一部分查找httphttps,后跟www.,并使整个组合成为可选。

    (https?:\/\/www\.)?
    

    第二部分是寻找字符串instagram.com

    instagram\.com
    

    第三部分是查找/p/ 之后的斜线后面的任何字母,以及可选的尾随斜线/。请注意,正则表达式的这部分在括号中,因此您可以稍后在使用 preg_match_all 时检索它。

    (\/p\/\w+\/?)
    

    解决方案 2

    如果您也希望能够支持以下模式(with http/https www):

    http://instagram.com/p/BkbwlrfjGHY
    http://instagram.com/p/BkbwlrfjGHY/
    https://instagram.com/p/BkbwlrfjGHY
    https://instagram.com/p/BkbwlrfjGHY
    

    你可以使用这个正则表达式:

    /(https?:\/\/(www\.)?)?instagram\.com(\/p\/\w+\/?)/
    

    示例

    $string = 'https://www.instagram.com/p/abcd/?post->
               https://www.instagram.com/p/efgh
    
               http://www.instagram.com/p/iJkL/ ->
               http://www.instagram.com/p/MnNadfoadf
    
               instagram.com/p/ACDOFfaf ->
               instagram.com/p/AFMDAOF';
    
    preg_match_all('/(https?:\/\/(www\.)?)?instagram\.com(\/p\/\w+\/?)/', $string, $matches);
    

    然后,如果您执行var_dump$matches

    array(4) {
      [0]=>
      array(6) {
        [0]=>
        string(33) "https://www.instagram.com/p/abcd/"
        [1]=>
        string(32) "https://www.instagram.com/p/efgh"
        [2]=>
        string(32) "http://www.instagram.com/p/iJkL/"
        [3]=>
        string(37) "http://www.instagram.com/p/MnNadfoadf"
        [4]=>
        string(24) "instagram.com/p/ACDOFfaf"
        [5]=>
        string(23) "instagram.com/p/AFMDAOF"
      }
      [1]=>
      array(6) {
        [0]=>
        string(12) "https://www."
        [1]=>
        string(12) "https://www."
        [2]=>
        string(11) "http://www."
        [3]=>
        string(11) "http://www."
        [4]=>
        string(0) ""
        [5]=>
        string(0) ""
      }
      [2]=>
      array(6) {
        [0]=>
        string(4) "www."
        [1]=>
        string(4) "www."
        [2]=>
        string(4) "www."
        [3]=>
        string(4) "www."
        [4]=>
        string(0) ""
        [5]=>
        string(0) ""
      }
      [3]=>
      array(6) {
        [0]=>
        string(8) "/p/abcd/"
        [1]=>
        string(7) "/p/efgh"
        [2]=>
        string(8) "/p/iJkL/"
        [3]=>
        string(13) "/p/MnNadfoadf"
        [4]=>
        string(11) "/p/ACDOFfaf"
        [5]=>
        string(10) "/p/AFMDAOF"
      }
    }
    

    现在要检索每个 id,您可以使用 foreach:

    foreach($matches[3] as $instagramId){
        echo $instagramId . "<br>";
    }
    

    结果将是:

    /p/abcd/
    /p/efgh
    /p/iJkL/
    /p/MnNadfoadf
    /p/ACDOFfaf
    /p/AFMDAOF
    

    【讨论】:

      【解决方案2】:

      下面是当用户名在路径中时也适用的正则表达式

      ^((https?):\/\/)?(www.)?instagram\.com(\/[A-Za-z0-9_.]*)?\/p\/([a-zA-Z0-9_-]+)\/?

      测试用例:

      https://instagram.com/p/BryAm8hnjGk

      https://www.instagram.com/anettletigre/p/BryAm8hnjGk/

      【讨论】:

        【解决方案3】:

        根据上面写的信息,加上我自己的一点点,我提出了一个通用的获取CODE的方法:

        (?:(?:(?:(?:https?)(?::\/\/))?(?:www\.))?)instagram\.com\/?(?<username>[a-zA-Z0-9_.]{1,30})?\/p\/(?<code>[A-Za-z0-9_\-]+)\/?
        

        例子:

        $string = '
            instagram.com/p/code1
            instagram.com/username1/p/code2
            instagram.com/p/code3/
            instagram.com/username2/p/code4/
        
            http://instagram.com/p/code5
            http://instagram.com/username3/p/code6
            http://instagram.com/p/code7/
            http://instagram.com/username4/p/code8/
            https://instagram.com/p/code9
            https://instagram.com/username5/p/code10
            https://instagram.com/p/code11/
            https://instagram.com/username6/p/code12/
        
            http://www.instagram.com/p/code13
            http://www.instagram.com/username7/p/code14
            http://www.instagram.com/p/code15/
            http://www.instagram.com/username8/p/code16/
        
            https://www.instagram.com/p/code17
            https://www.instagram.com/username9/p/code18
            https://www.instagram.com/p/code19/
            https://www.instagram.com/username10/p/code20/
        
        
            instagram.com/username11/p/code21?utm_source=...
            instagram.com/username12/p/code22/?utm_source=...
            https://www.instagram.com/p/code23?utm_source=...
            https://www.instagram.com/username13/p/code24/?utm_source=...';
        
        preg_match_all("/(?:(?:(?:(?:https?)(?::\/\/))?(?:www\.))?)instagram\.com\/?(?<username>[a-zA-Z0-9_.]{1,30})?\/p\/(?<code>[A-Za-z0-9_\-]+)\/?/", $string, $matches);
        
        echo "<pre>";
        print_r($matches);
        

        答案:

        Array
        (
            [0] => Array
                (
                    [0] => instagram.com/p/code1
                    [1] => instagram.com/username1/p/code2
                    [2] => instagram.com/p/code3/
                    [3] => instagram.com/username2/p/code4/
                    [4] => instagram.com/p/code5
                    [5] => instagram.com/username3/p/code6
                    [6] => instagram.com/p/code7/
                    [7] => instagram.com/username4/p/code8/
                    [8] => instagram.com/p/code9
                    [9] => instagram.com/username5/p/code10
                    [10] => instagram.com/p/code11/
                    [11] => instagram.com/username6/p/code12/
                    [12] => http://www.instagram.com/p/code13
                    [13] => http://www.instagram.com/username7/p/code14
                    [14] => http://www.instagram.com/p/code15/
                    [15] => http://www.instagram.com/username8/p/code16/
                    [16] => https://www.instagram.com/p/code17
                    [17] => https://www.instagram.com/username9/p/code18
                    [18] => https://www.instagram.com/p/code19/
                    [19] => https://www.instagram.com/username10/p/code20/
                    [20] => instagram.com/username11/p/code21
                    [21] => instagram.com/username12/p/code22/
                    [22] => https://www.instagram.com/p/code23
                    [23] => https://www.instagram.com/username13/p/code24/
                )
        
            [username] => Array
                (
                    [0] => 
                    [1] => username1
                    [2] => 
                    [3] => username2
                    [4] => 
                    [5] => username3
                    [6] => 
                    [7] => username4
                    [8] => 
                    [9] => username5
                    [10] => 
                    [11] => username6
                    [12] => 
                    [13] => username7
                    [14] => 
                    [15] => username8
                    [16] => 
                    [17] => username9
                    [18] => 
                    [19] => username10
                    [20] => username11
                    [21] => username12
                    [22] => 
                    [23] => username13
                )
        
            [1] => Array
                (
                    [0] => 
                    [1] => username1
                    [2] => 
                    [3] => username2
                    [4] => 
                    [5] => username3
                    [6] => 
                    [7] => username4
                    [8] => 
                    [9] => username5
                    [10] => 
                    [11] => username6
                    [12] => 
                    [13] => username7
                    [14] => 
                    [15] => username8
                    [16] => 
                    [17] => username9
                    [18] => 
                    [19] => username10
                    [20] => username11
                    [21] => username12
                    [22] => 
                    [23] => username13
                )
        
            [code] => Array
                (
                    [0] => code1
                    [1] => code2
                    [2] => code3
                    [3] => code4
                    [4] => code5
                    [5] => code6
                    [6] => code7
                    [7] => code8
                    [8] => code9
                    [9] => code10
                    [10] => code11
                    [11] => code12
                    [12] => code13
                    [13] => code14
                    [14] => code15
                    [15] => code16
                    [16] => code17
                    [17] => code18
                    [18] => code19
                    [19] => code20
                    [20] => code21
                    [21] => code22
                    [22] => code23
                    [23] => code24
                )
        
            [2] => Array
                (
                    [0] => code1
                    [1] => code2
                    [2] => code3
                    [3] => code4
                    [4] => code5
                    [5] => code6
                    [6] => code7
                    [7] => code8
                    [8] => code9
                    [9] => code10
                    [10] => code11
                    [11] => code12
                    [12] => code13
                    [13] => code14
                    [14] => code15
                    [15] => code16
                    [16] => code17
                    [17] => code18
                    [18] => code19
                    [19] => code20
                    [20] => code21
                    [21] => code22
                    [22] => code23
                    [23] => code24
                )
        
        )
        
        
        

        【讨论】:

        • @Second2None ,以任何格式将帖子的链接传递给 instagram - 正则表达式返回所需的部分,即代码。另外,如果链接中有uername,也会返回
        • 不是我哥们,在你的帖子里 :)
        【解决方案4】:

        如果 instagram.com 是您要搜索的唯一 URL,则 strpos 将比正则表达式运行得更快:

        <?php
        
        $test = [
        'https://www.instagram.com/p/BKbwlrfjGHY/',
        'https://www.instagram.com/p/BKbwlrfjGHY',
        'http://www.instagram.com/p/BKbwlrfjGHY/',
        'http://www.instagram.com/p/BKbwlrfjGHY',
        'instagram.com/p/BKbwlrfjGHY/',
        'someother.com/p/asdfads',
        'instagram.com/p/BKbwlrfjGHY'];
        
        $target = 'instagram.com';
        $offset = strlen($target);
        foreach ($test as $url) {
                $p = strpos($url, $target);
                if ($p === false) {
                        echo 'Not an instagram URL'.PHP_EOL;
                } else {
                        $instagramId = rtrim(substr($url,$p+$offset),'/');
        
                        echo $instagramId.' is an instagram id'.PHP_EOL;
                }
        }
        

        【讨论】:

        • 我想提取图片 ID 并检查它是否是 Instagram URL,所以我认为正则表达式是可行的方法。
        • @JoeJankowiak - 更新为将 instagram id 分配给变量。
        【解决方案5】:
        (https?:\/\/www\.)?(?:instagram.com|instagr.am)\/p\/([^\/]*)\/?
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-27
          • 1970-01-01
          • 2018-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多