2013-05-09 6 views
0

Я хотел бы использовать preg_match в PHP для проверки формата URL. URL выглядит следующим образом:Как preg_match для определенного шаблона в URL-адресе?

/2013/09/05/item-01.html 

Я пытаюсь получить эту работу:

if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$", $_SERVER['REQUEST_URI'])) : 
    echo "match"; 
endif; 

Но что-то не совсем правильно. Есть идеи?

+0

** Что означает «не совсем правильно»? ** «Не совсем правильно» - это неадекватное описание для понимания проблемы. Что случилось, когда вы попробовали? Получили ли вы неправильные результаты? Вы получили * нет * результаты? Если результаты были неверными, что сделало их неправильными? Что вы ожидали вместо этого? Вы получили * любые * правильные результаты? Если да, то каковы они? Не заставляй нас гадать. –

+0

Извините. «Не совсем правильно» я имел в виду, что это не соответствует, но я чувствовал, что был близок! – user2366298

ответ

0

Try:

if (preg_match('!\d{4}/\d{2}/\d{2}/.*\.html$!', $_SERVER['REQUEST_URI'])) { 
    echo 'match'; 
} 

\d коротка для [0-9], и вы можете использовать различные начала/окончания разделителей (я использую в этом случае!), Чтобы сделать регулярное выражение более читаемым, когда вы пытаетесь соответствовать слэши.

+0

Это отлично работает, спасибо! – user2366298

0

Похоже, что вы почти правильно с тем, что у вас есть, если у вас есть некоторые незначительные проблемы

  1. вы забыли, чтобы избежать вашего последнего «/» перед page.html
  2. на [.] + должен быть [^.] +, вы не ищете 1 или более периодов, вы ищете что-то не время.
  3. Вы не должны быть с помощью [], чтобы соответствовать HTML, а() или вообще ничего
 
if (preg_match("/([0-9]{4})\/([0-9]{2})\/([0-9]{2})\/([^.]+.html)$", $_SERVER['REQUEST_URI'])) : 
    echo "match"; 
endif; 

Также вы, вероятно, следует узнать, когда следует использовать(), они используются, чтобы убедиться, вы храните все, что соответствует им. В вашем случае я не уверен, хотите ли вы хранить каждую директорию до файла или нет.

+0

Спасибо за публикацию решения и четкое объяснение. – user2366298

0

Мое предположение: у вас было рабочее выражение для файла пути, и он переставал работать, когда вы пытались добавить часть имени файла.

preg_match() требует указать пару разделительных символов; по одному на каждом конце выражения. Похоже, что у вас есть это, но вы добавили дополнительный бит выражения (то есть имя файла) в конце строки за пределами разделителей. Это неверно.

"/([0-9]{4})\/([0-9]{2})\/([0-9]{2})/[.]+[.html]$" 
^        ^
your start delimiter    your end delimiter 

Вам нужно переместить код выражения [.]+[.html]$, что в настоящее время после окончания ограничителя так, что внутри него.

Это должно решить проблему.