Получение идентификатора из URL с помощью регулярных выражений - PullRequest
0 голосов
/ 15 октября 2011
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567%2Fsubtitle
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456%2Fsubtitle
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567%2F
http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456%2F

URL всегда начинается с:

http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F

Идентификаторы всегда числовые, однако количество цифр может варьироваться.

Как получить идентификатор (1234567и 123456) из приведенных выше примеров URL?

Я попытался использовать следующий шаблон без удачи (он не возвращает совпадений):

/^http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F(\d)$/

Ответы [ 5 ]

3 голосов
/ 15 октября 2011

Я бы порекомендовал вам сначала проанализировать этот URL и извлечь параметр строки запроса url и URL, декодирующий его:

function getParameterByName(url, name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(url);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));
}

следующим образом:

var url = 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567';
var p = getParameterByName(url, 'url');

, а затем с помощью некоторого регулярного выражения проанализировать p и извлечь необходимую информацию, например /\d+/.

1 голос
/ 15 октября 2011

С правильными функциями парсинга URL вы можете сделать это:

parse_str(parse_url($url, PHP_URL_QUERY), $params);
if (isset($params['url'])) {
    parse_str(parse_url($params['url'], PHP_URL_QUERY), $params);
    if (isset($params['movie'])) {
        $movie = $params['movie'];
    }
}
1 голос
/ 15 октября 2011
$urls = array(
   'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567'
   , 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567%2Fsubtitle'
   , 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456'
   , 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456%2Fsubtitle'
   , 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567%2F'
   , 'http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F123456%2F'
);

foreach ($urls as $url) {
   if (preg_match('/%2Fmovie%2F(\d+)/', $url, $matches)) {
      var_dump($matches[1]);
   }
}

ПОЦЕЛУЙ.Изначально я собирался использовать parse_url(), но в любом случае невозможно разобрать строку запроса без регулярных выражений.

1 голос
/ 15 октября 2011

Есть способ и без разбора тоже. Предполагая, что $ url = URL

http://codepad.org/t91DK9H2

$url = "http://example.com/movie.swf?url=http%3A%2F%2Fexample.com%2Fmovie%2F1234567%2Fsubtitle";
$reg = "/^([\w\d\.:]+).*movie%2F(\d+).*/";
$id = preg_replace($reg,"$2",$url);
0 голосов
/ 15 октября 2011

Похоже, вам нужно избегать некоторых специальных символов.попробуйте:

/ ^ http://example.com/movie.swf\?url=http%3A%2F%2Fexample.com%2Fmovie%2F(\d+)$/

...