Помогите с регуляркой preg_match

Тема в разделе "Как сделать...", создана пользователем killoff, 18 авг 2015.

  1. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.167
    Симпатии:
    796
    Всем привет. В общем проблемка у меня с одной функцией, раньше работала нормально, а с начала года перестала, руки только сейчас до неё добрались чтобы разобраться в чем причина. В общем есть
    Код:
    function getVKVideoInfo($link, $getFilesizes = false) {
        $html = file_get_contents(urldecode($link));
        preg_match('/(?<=var vars = ).+}/', $html, $matches);
        $json = json_decode(mb_convert_encoding($matches[0], "UTF-8", "CP1251"), true);
        $result['name'] = urldecode($json['md_title']);
        foreach ($json as $key => $value) {
            if (strpos($key, 'url') === 0) {
                preg_match('/^.+videos\/\w+\.(\d{3,4}).(\w{3,5})(?>=?)/', $value, $matches);
                preg_match('/^.+videos\/\w+\.?(\d{3,4})?.(\w{3,5})(?>=?)/', $value, $matches);
                $temp = array('link' => $value, 'quality' => $matches[1], 'format' => $matches[2]);
                if ($getFilesizes) {
                    $head = array_change_key_case(get_headers($matches[0], true));
                    $temp['size'] =  round($head['content-length'] / 1024 / 1024, 2);
                }
                $result['urls'][] = $temp;
                unset($temp);
            }
        }
    
        return $result;
    }
    и в ней перестала работать регулярка прописанная в preg_match.
    Код:
    var vars = {"uid":"6613833","vid":171245004,"oid":6613833,"host":"http:\/\/cs542408v4.vk.me\/","vtag":"9e0d223a6b","ltag":"l_e0df44be","vkid":171245004,"md_title":"1%2F5454-3","md_author":"%D0%95%D0%B2%D0%B3%D0%B5%D0%BD%D0%B8%D0%B9+%D0%9D%D1%83%D0%B6%D0%BD%D1%8B%D0%B9","author_id":6613833,"author_href":"\/byroot","hd":2,"no_flv":1,"hd_def":0,"dbg_on":0,"t":0,"duration":3852,"thumb":"http:\/\/cs629321.vk.me\/v629321833\/608e\/sT7FGm6n5L0.jpg","hash":"2e90bd964998bb508baa29737b1ebe47","hash2":"3d1e3e17f7bb8778","angle":0.000000,"img_angle":0.000000,"repeat":0,"show_ads_preroll":0,"show_ads_postroll":0,"show_ads_overlay":0,"legal_owner":0,"eid1":0,"slot":0,"g":1,"a":32,"puid34":1,"water_mark":"","can_rotate":1,"c3":"","no_adfox":1,"ads_preview":0,"puid4":0,"puid41":5,"url240":"http:\/\/cs542408v4.vk.me\/7\/u6613833\/videos\/9e0d223a6b.240.mp4?extra=pxJV5c8IPP6-Xe2t4Y6oFnq-NjEk90m7hW7MCKBJfikWSzAPMn_7__MXNZz3LEdCy5h9UhGX6VIBMJkAs3ij3HQOjPs","url360":"http:\/\/cs542408v4.vk.me\/7\/u6613833\/videos\/9e0d223a6b.360.mp4?extra=pxJV5c8IPP6-Xe2t4Y6oFnq-NjEk90m7hW7MCKBJfikWSzAPMn_7__MXNZz3LEdCy5h9UhGX6VIBMJkAs3ij3HQOjPs","url480":"http:\/\/cs542408v4.vk.me\/7\/u6613833\/videos\/9e0d223a6b.480.mp4?extra=pxJV5c8IPP6-Xe2t4Y6oFnq-NjEk90m7hW7MCKBJfikWSzAPMn_7__MXNZz3LEdCy5h9UhGX6VIBMJkAs3ij3HQOjPs","jpg":"http:\/\/cs629321.vk.me\/v629321833\/608d\/3c4O6NbyrUI.jpg","timeline_thumbs":1,"timeline_thumbs_jpg":"http:\/\/cs625618.vk.me\/v625618833\/3e2e7\/LI17LlHfbxQ.jpg,http:\/\/cs629412.vk.me\/v629412833\/b61c\/M4lPcVchkU8.jpg,http:\/\/cs629206.vk.me\/v629206833\/803b\/5F7M2ldhsp0.jpg,http:\/\/cs628026.vk.me\/v628026833\/d07c\/IyEj5LRMlwA.jpg","timeline_thumbs_per_row":10,"timeline_thumbs_per_image":100,"timeline_thumbs_total":385,"timeline_thumb_width":100.000000,"timeline_thumb_height":75,"ip_subm":1,"video_ext":1,"is_yandex":0,"is_vk":0,"is_ext":1,"lang_add":"Добавить к себе","lang_added":"Добавлено к себе","lang_share":"Рассказать друзьям","lang_like":"Мне нравится","lang_subscribe":"Подписаться","lang_subscribed":"Вы подписаны","lang_volume_on":"Включить звук","lang_volume_off":"Убрать звук","lang_volume":"Громкость","lang_hdsd":"Сменить качество","lang_open_popup":"Развернуть","lang_fullscreen":"На весь экран","lang_window":"Свернуть","lang_rotate":"Повернуть","lang_ads_link":"Сайт рекламодателя","lang_ads":"Реклама","lang_ads_skip":"Пропустить рекламу","lang_next":"Следующее видео","lang_next_cancel":"Отменить","lang_replay":"Воспроизвести ещё раз","lang_ads_skip_time":"Пропустить рекламу через {time}","lang_report_problem":"Сообщить о проблеме...","video_play_hd":"Смотреть в высоком качестве","video_stop_loading":"Прервать загрузку","video_player_version":"ВКонтакте видео плеер ","goto_orig_video":"Перейти к видеозаписи","video_get_video_code":"Копировать код видео","video_load_error":"Видеофайл ещё не загрузился или сервер с видеофайлом временно недоступен","video_get_current_url":"Копировать ссылку на кадр"}
    На данный момент функция вроди бы с одной стороны работает, а на некоторых ссылка не работает, и вместо $value выдает вообще какие-то левые значения.

    Кто хорошо знает регулярки - помогите поправить код чтобы работал он нормально.
     
  2. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    на сколько я помню, там HTML еще есть?

    Или нет, тогда json_decode быстрее
    PHP:
    $json json_decode(substr($str11), true);
    UPD: Там есть HTML: Перейти по ссылке
     
    Последнее редактирование: 18 авг 2015
  3. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.167
    Симпатии:
    796
    Это вместо
    Код:
    $json = json_decode(mb_convert_encoding($matches[0], "UTF-8", "CP1251"), true);
    или после? А регулярка правильно записана?

    Вообще там есть HTML, исходник страницы с массивом Перейти по ссылке
     
  4. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    PHP:
    preg_match("#(.*)var vars \=(.*?)(var|window|\<\/script|\;)(.*)#su"$str$matches);
    $matches mb_convert_encoding($matches[2], "UTF-8""CP1251");
    $json json_decode(trim($matchestrue);
    У меня работает, проверил тут: Перейти по ссылке
    На этом видео: Перейти по ссылке
     
  5. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.167
    Симпатии:
    796
    А как там проверить работу? Как этот кусок кода добавить в функцию выше? Пробовал просто как заменить preg_match но выдает ошибку при загрузке страницы
     
  6. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    В $pattern:
    Код:
    (.*)var vars \=(.*?)(var|window|\<\/script|\;)(.*)#su
    В $subject текст, в котором искать (исходный код страницы видео)

    Там проверка одной функции, я проверял preg_match.
     
  7. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.167
    Симпатии:
    796
    В общем так же перед качеством например *.240,mp4 берет какое то левое значение на некоторых видео, например отсюда Перейти по ссылке

    с этой регуляркой функция немного не так работает, и для названия (не расширения файла, а для названия ссылки на странице вывода) цепляет не mp4 а FLV и постоянно вместо разного выбора качества идет FLV
     
    Последнее редактирование: 18 авг 2015
  8. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    На этой странице 1 json массив, если его регулярка получает - то всё хорошо.
    А дальше дело уже не в регулярке.
     
  9. killoff

    killoff CD тихо, и не DVD меня ;)

    Moderator
    Регистр.:
    13 май 2008
    Сообщения:
    2.167
    Симпатии:
    796
    а чём тогда? Тот код что в первом посте писал получал точно теже данные, и сравнивая ссылку с Savefrom.net на странице где ссылка не работает - имя файла левое, на старые загруженные видео ссылка работает и имя файла совпадает c Savefrom... В чем тогда может быть косяк? :facepalm:

    Именно выделенная часть не всегда верно выходит: 459edf7acf.240.mp4
     
  10. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    385
    Симпатии:
    254
    Код:
    {
    "uid":"317204999",
    "vid":171444669,
    "oid":317204999,
    "host":"https:\/\/cs542307.vk.me\/",
    "vtag":"06dbabab79",
    "ltag":"l_65354b3e",
    "vkid":171444669,
    "md_title":"1%2F5175",
    "md_author":"%D0%93%D0%BB%D0%B5%D0%B1+%D0%A1%D1%82%D1%80%D0%BE%D0%B3%D0%B0%D0%BD%D0%BE%D0%B2",
    "author_id":317204999,
    "author_href":"\/b9039010326",
    "hd":3,
    "no_flv":1,
    "hd_def":0,
    "dbg_on":0,
    "t":0,
    "duration":5215,
    "thumb":"https:\/\/pp.vk.me\/c621616\/v621616999\/3631e\/bAtdot9CHgM.jpg",
    "hash":"77f8f042fd393b5b766aa8a6a3dbdae6",
    "hash2":"de8b10f2b0efeca4",
    "angle":0.000000,
    "img_angle":0.000000,
    "repeat":0,
    "show_ads_preroll":0,
    "show_ads_postroll":0,
    "show_ads_overlay":0,
    "legal_owner":0,
    "eid1":0,
    "slot":0,
    "g":1,
    "a":16,
    "puid34":0,
    "water_mark":"",
    "can_rotate":1,
    "c3":"",
    "no_adfox":1,
    "ads_preview":0,
    "puid4":0,
    "puid41":1,
    "url240":"https:\/\/cs542307.vk.me\/7\/u317204999\/videos\/06dbabab79.240.mp4?extra=8Y42QT52QM0gMHzrRFNzJFQlmL2Qrlj7IyzKM61N7efncBM8kzB18X03shlRMBslpbUOixq0PZnoiQRYK7EGAGUQYNn3nxor",
    "url360":"https:\/\/cs542307.vk.me\/7\/u317204999\/videos\/06dbabab79.360.mp4?extra=8Y42QT52QM0gMHzrRFNzJFQlmL2Qrlj7IyzKM61N7efncBM8kzB18X03shlRMBslpbUOixq0PZnoiQRYK7EGAGUQYNn3nxor",
    "url480":"https:\/\/cs542307.vk.me\/7\/u317204999\/videos\/06dbabab79.480.mp4?extra=8Y42QT52QM0gMHzrRFNzJFQlmL2Qrlj7IyzKM61N7efncBM8kzB18X03shlRMBslpbUOixq0PZnoiQRYK7EGAGUQYNn3nxor",
    "url720":"https:\/\/cs542307.vk.me\/7\/u317204999\/videos\/06dbabab79.720.mp4?extra=8Y42QT52QM0gMHzrRFNzJFQlmL2Qrlj7IyzKM61N7efncBM8kzB18X03shlRMBslpbUOixq0PZnoiQRYK7EGAGUQYNn3nxor",
    "jpg":"https:\/\/pp.vk.me\/c621616\/v621616999\/3631d\/RCV16S5z0Yg.jpg",
    "timeline_thumbs":1,
    "timeline_thumbs_jpg":"https:\/\/pp.vk.me\/c624824\/v624824999\/4326c\/GfVLaAqKCoY.jpg,https:\/\/pp.vk.me\/c628123\/v628123999\/1023b\/orQghBnJNgA.jpg,https:\/\/pp.vk.me\/c625525\/v625525999\/3cc68\/1vNGuo-Sc-8.jpg,https:\/\/pp.vk.me\/c628319\/v628319999\/1124c\/8YQMMZU5jRI.jpg,https:\/\/pp.vk.me\/c622221\/v622221999\/3d605\/Uq04nIk9Csg.jpg,https:\/\/pp.vk.me\/c625220\/v625220999\/33b50\/lUQWhwfK4DE.jpg",
    "timeline_thumbs_per_row":10,
    "timeline_thumbs_per_image":100,
    "timeline_thumbs_total":521,
    "timeline_thumb_width":100.000000,
    "timeline_thumb_height":75,
    "ip_subm":1,
    "proxy":"psv4",
    "https":1,
    "video_ext":1,
    "is_yandex":0,
    "is_vk":0,
    "is_ext":1,
    "lang_add":"Добавить к себе",
    "lang_added":"Добавлено к себе",
    "lang_share":"Рассказать друзьям",
    "lang_like":"Мне нравится",
    "lang_subscribe":"Подписаться",
    "lang_subscribed":"Вы подписаны",
    "lang_volume_on":"Включить звук",
    "lang_volume_off":"Убрать звук",
    "lang_volume":"Громкость",
    "lang_hdsd":"Сменить качество",
    "lang_open_popup":"Развернуть",
    "lang_fullscreen":"На весь экран",
    "lang_window":"Свернуть",
    "lang_rotate":"Повернуть",
    "lang_ads_link":"Сайт рекламодателя",
    "lang_ads":"Реклама",
    "lang_ads_skip":"Пропустить рекламу",
    "lang_next":"Следующее видео",
    "lang_next_cancel":"Отменить",
    "lang_replay":"Воспроизвести ещё раз",
    "lang_ads_skip_time":"Пропустить рекламу через {time}",
    "lang_report_problem":"Сообщить о проблеме...",
    "video_play_hd":"Смотреть в высоком качестве",
    "video_stop_loading":"Прервать загрузку",
    "video_player_version":"ВКонтакте видео плеер ",
    "goto_orig_video":"Перейти к видеозаписи",
    "video_get_video_code":"Копировать код видео",
    "video_load_error":"Видеофайл ещё не загрузился или сервер с видеофайлом временно недоступен",
    "video_get_current_url":"Копировать ссылку на кадр"
    }

    Тут выбора нет, есть выбор из разрешения видео и всё.

    Наверно, savefrom из другого места берет ссылки

    Или ВК браузер возможно фильтрует. Старый браузер - FLV. Новый - mp4