Чупи се кода при preg_match.

Ticketa

Registered
Имам следния код, който го ползвам за youtube клипове:

PHP:
<?php
function get_http_response_code($url) {
    $headers = get_headers($url);
    return substr($headers[0], 9, 3);
}
$videoUrl = "http://www.youtube.com/watch?v=AkFqg5wAuFk";
if (preg_match("/^(http:\/\/|https:\/\/)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}/i", $videoUrl)) {
	if (preg_match("/http:\/\/(www\.)?youtube\.com\//i", $videoUrl) || preg_match("/http:\/\/(www\.)?youtu\.be\//i", $videoUrl)) {
		if(get_http_response_code($videoUrl) != "404"){
			// избор на дълъг адрес
			if(preg_match("/http:\/\/.{2,3}\.youtube\.com\/watch\?v=([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
				$VideoID = $matches[1];
			}
			// избор на кратък адрес
			if(preg_match("/http:\/\/youtu\.be\/([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
				$VideoID = $matches[1];
			}
			$source = file_get_contents($videoUrl);
			$title = explode("<title>", $source);
			$title = explode("</title>", $title[1]);
			$title = str_replace(" ", "", $title[0]);
			$title = iconv('utf-8', 'windows-1251', urldecode($title));

			$pics = "http://img.youtube.com/vi/".$VideoID."/default.jpg";
			echo "
			Адрес: $VideoID<br />
			Title: $title<br />
			Pic: $pics";
		} else {
			echo "Възникна грешка. Опитайте по-късно или проверете дали адреса е валиден!";
		}
	} else {
		echo "Този адрес не е от youtube.com";
	}
} else {
        echo "Невалиден адрес.";
}
?>

Скрипта си бачка - няма ядове. Обаче. Има доста потребители, които вместо: http://www.youtube.com/watch?v=AkFqg5wAuFk

Пишат http://youtube.com/watch?v=AkFqg5wAuFk

И като го няма "www" просто чупи кода и не се взима $VideoID-то.

Това става при:
PHP:
// избор на дълъг адрес
if(preg_match("/http:\/\/.{2,3}\.youtube\.com\/watch\?v=([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
	$VideoID = $matches[1];
}
// избор на кратък адрес
if(preg_match("/http:\/\/youtu\.be\/([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
	$VideoID = $matches[1];
}

Пробвах и така:

PHP:
// избор на дълъг адрес
if(preg_match("/http:\/\/(www\.)?youtube\.com\/watch\?v=([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
	$VideoID = $matches[1];
}
// избор на кратък адрес
if(preg_match("/http:\/\/(www\.)?youtu\.be\/([-|~_0-9A-Za-z]+).*/i", $videoUrl, $matches) ) {
	$VideoID = $matches[1];
}

Въобще не иска да бачка.

Не искам няк'ви готови кодове, а просто да си оправя проблема по моя код. Надявам се някой да удари едно рамо и да ми каже, къде по дяволите греша с регулярните изрази.

П.П. Другото, което се сещам е просто да спирам кода още при втория preg_match, ако в домейна няма "www", но ми се вижда безсмислено при положение, че може да се направи да работи и със WWW и без трите W.
 
Не виждаш смисъл? при положение че чрез експлоуда ще си вземеш "v=бляблябля" кода и ще си решиш ядовете 10 пъти по-лесно отколкото с матчване.
 
spellsingero каза:
Не виждаш смисъл? при положение че чрез експлоуда ще си вземеш "v=бляблябля" кода и ще си решиш ядовете 10 пъти по-лесно отколкото с матчване.

И защо трябва да използва спънатите ви варианти ? Хората са създали parse_url(). Този explode() го ползвате, както си искате и то не за точни цели. Кой ти дели тагове с explode() ? Или пък вади част от URL ?
 

Back
Горе