2012-02-27 2 views
3

если у меня есть этот URL: node/95/pdf/1. Как я могу получить числовое значение/значение 1? Пробовал parse_url, но дал мне неправильный результат.как разобрать этот URL?

PS: значение 1 является всего лишь примером, идентификатор динамический зависит от того, что пользователь нажимает.

ответ

3

Я хотел бы использовать sscanf

Непроверено пример:

list($node_id, $pdf_id) = sscanf($url, "node/%d/pdf/%d"); 

$node_id содержит идентификатор узла, $pdf_id содержит идентификатор формата PDF. Согласно вашему комментарию: да, вы можете вывести его, например. echo $pdf_id;.

Если вы нуждаетесь в них как в массиве, вы можете удалить метод list(), делая это так:

$ids = sscanf($url, "node/%d/pdf/%d");.

Это возвращает массив с идентификатором узла и pdf в $ids.

Наконец, если вам просто нужен Ф идентификатор, вы могли бы сделать

$id = sscanf($url, "node/95/pdf/%d");.

Я только что показал, как извлечь оба из-за того, что я предположил, что вам могут потребоваться оба номера из вашего URL-адреса.

Редактировать
видеть все другие ответы после отправки моего решения, я задаюсь вопрос, почему все решения этого с множеством функций, когда существует функция доступна, что делает именно то, что ему нужно: разбор строки в соответствии с форматом , Это также приводит к меньшему количеству кода, подвергнутого инъекции sql-инъекции IMHO. И это не нарушает что-либо, когда URL-адрес расширяется или строки запроса добавляются.

Edit 2 list($node_id, $sub, $sub_id) = sscanf($url, "node/%d/%[^/]/%d"); получит Вас "PDF", и это идентификатор отдельно вместо "узла /% d /% s /% D". Это связано с тем, что char / также соответствует %s. Использование %[^/] соответствует всем, кроме косой черты.

+0

Я не совсем понимаю ваш код. Как получить pdf_id?echo $ pdf_id? Извините, если я действительно замешкаюсь на этом. –

+0

в этом примере sscanf возвращает массив. '% d' означает« цифры ». поэтому sscanf берет ваш url и предполагает наличие 'node//pdf/'. части цифр, возвращаемые sscanf в виде массива. использование list() сохраняет их в отдельных переменных, что может быть удобно и потому, что я думал, что вам также может понадобиться идентификатор узла. Я обновил ответ, чтобы предоставить больше примеров. – pduersteler

+0

попробовал ваш код, но он возвращает мне пробел. var_dump ($ pdf_id) дает мне null. T_T. я делаю это неправильно? –

3

Вы можете сделать это:

$id = end(explode('/', 'node/95/pdf/1')); 

Пример:

$arr = explode('/', 'node/95/pdf/1'); 
$id = end($arr); 
echo $id; // 1 
0

Попробуйте с:

$input = 'node/95/pdf/1'; 
$parts = explode('/', $input); 
$output = (int) $parts[3]; 
2
$url = "node/95/pdf/1"; 
// Find the last occurence of a slash, get everything after that. 
$id = substr($url, strrpos($url, "/") + 1); 
+1

, что если идентификатор находится в 100 или 1000? например, узел/95/pdf/1000 .. будет ли ваш код работать? –

+0

@ user1074776: Он все равно будет работать –

+0

@ user1074776: Как я уже сказал в комментарии, он получает все после последней косой черты. Его длина не имеет значения. –

0

Вы можете использовать basename() функцию, чтобы захватить последний компонент пути:

echo +basename("node/95/pdf/1/foo/8?foo=bar"); // int(8) 
+0

из всех приведенных примеров, я думаю, что это самый простой или самый быстрый из всех. спасибо^_^ –

+1

Хорошее решение. Однако это также включает любые строки запросов, которые могут появиться. Так, например, имея URL-адрес, например 'node/95/pdf/1? foo = bar', возвращает' 1? foo = bar', что может нарушить вашу функциональность. Кроме того, наличие расширенного URL-адреса, такого как 'node/95/pdf/1/foo/8', не даст вам правильного идентификатора. Итак, хорошее решение, НО имейте в виду, что вы можете нарушить свою собственную систему при ее расширении. – pduersteler

+1

@pduersteler: Я написал ответ на основе ввода образца. Добавление '+' избавляется от строки запроса, если таковая имеется. –

Смежные вопросы