PHP preg_match между текстом и первым появлением - - PullRequest
0 голосов
/ 07 февраля 2011

Я пытаюсь получить 12345 из следующего URL с помощью preg_match.

$url = "http://www.somesite.com/directory/12345-this-is-the-rest-of-the-url.html";

$beg = "http://www.somesite.com/directory/";
$close = "\-";
preg_match("($beg(.*)$close)", $url, $matches);

Я пробовал несколько комбинаций. *? \ Б

Кто-нибудь знает, как извлечь 12345 из URL с помощью preg_match?

Ответы [ 3 ]

3 голосов
/ 07 февраля 2011

Две вещи, во-первых, вам нужно preg_quote, а также вам нужны разделители. Используя ваш метод строительства:

$url = "http://www.somesite.com/directory/12345-this-is-the-rest-of-the-url.html";

$beg = preg_quote("http://www.somesite.com/directory/", '/');
$close = preg_quote("-", '/');
preg_match("/($beg(.*?)$close)/", $url, $matches);

Но я бы написал запрос немного иначе:

preg_match('/directory\/(\d+)-/i', $url, $match);

Он соответствует только части каталога, гораздо более читабелен и гарантирует, что вы получите только цифры назад (без строк)

1 голос
/ 07 февраля 2011

Это не использует preg_match, но достигнет того же самого и будет выполняться быстрее:

$url = "http://www.somesite.com/directory/12345-this-is-the-rest-of-the-url.html";

$url_segments = explode("/", $url);
$last_segment = array_pop($url_segments);

list($id) = explode("-", $last_segment);

echo $id; // Prints 12345
0 голосов
/ 07 февраля 2011

Слишком медленно, я ^^. Ну, если вы не застряли на preg_match, вот быстрая и удобочитаемая альтернатива:

$num = (int)substr($url, strlen($beg));

(глядя на ваш код, я догадался, что искомое число является числовым идентификатором, это типично для URL-адресов, выглядящих так, и не будет "12abc" или чем-то еще.)

...