2014-04-28 2 views
0

для маршрутизации URL-адреса Яpreg_match_all выпуск регулярных выражений для URL маршрутизации

Patern:

/^\/stuff\/other-stuff\/(?:([^\/]\+?))$/i

Тема:

/stuff/other-stuff/foo-AB123456.html

почему $ NUM_MATCHES равно 0 ??

$num_matches = preg_match_all($patern, $subject, $matches);

Помощь должна быть принята с благодарностью :)

+1

Что должно соответствовать '[^ \ /] \ +?'? – Robin

ответ

0

из-за этого:

[^\/]\+? 

во-первых, нет слэш после other-stuff, так что вы не можете найти предложение с отрицается / во-вторых, + не должен быть экранирован, если вы выполняете такой вид соответствия. + следует избегать, когда вы выполняете буквальное совпадение.

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

^\/stuff\/other-stuff\/(?:(.+?))$ 

демо здесь: http://regex101.com/r/aV9cR0

будет соответствовать foo-AB123456.html в первом захвате

+0

'+ + не должно быть экранировано, если вы делаете такой вид соответствия. + должен быть экранирован только тогда, когда вы выполняете буквальное совпадение.' => Это на самом деле главная причина, спасибо вам большое! – Littlekisscool

+0

@ Littlekisscool это мои слова, так? – aelor

+0

(верхний комментарий отредактирован, я не привык писать в stackoverflow :) – Littlekisscool

0
$patern= "#^/stuff/other-stuff/([^/]+)$#i"; 


$subject = "/stuff/other-stuff/foo-AB123456.html"; 


preg_match_all($patern, $subject, $matches); 

print_r($matches[1]); 
0

Он смотрит на меня, как ваше регулярное выражение может быть упрощена что-то вроде:

(?i)^/stuff/other-stuff/[\w-.]+$ 

Это будет выглядеть так:

<?php 
$regex="~(?i)^/stuff/other-stuff/([\w-./]+)$~"; 
$string = "/stuff/other-stuff/foo-AB123456.html"; 
$hit = preg_match($regex,$string,$m); 
echo $m[0]."<br />"; 
echo $m[1]."<br />"; 
?> 

Выход:

/stuff/other-stuff/foo-AB123456.html 
foo-AB123456.html 

Обратите внимание, что это может быть сделано в ряде различных способов.

Ниже приведены некоторые сведения о регулярном выражении.

  1. ~ разделитель лучше, чем оригинальный /, потому что вы не должны избежать косой черты.
  2. Скобки в ([\w-.]+) захвата конца URL в группе 1. Именно поэтому $m[1] дает foo-AB123456.html
  3. После финального слэш [\w-./]+ совпадает с любым количеством букв или цифр, подчеркивания, тире, точки и слеша. Это «мини-спецификация» для тех персонажей, которые мы ожидаем там. Если вы хотите что-то разрешить, вы можете пойти с простой точкой.
Смежные вопросы