2016-09-14 2 views
3

Так Im принимая ссылки из базы данных, и те, выглядят следующим образом:Regex preg_match не работает, как ожидалось

www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html 
www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm 
www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html 

В моих URLS цикла по каждому элементу представлены как $row['links']; , что им пытаются сделать, это взять только беспородную URL -title-НЕОБХОДИМОСТЬ. Это означает, что мне нужен текст в URL из последней косой черты (после случайного кода) до конца URL. Im используя эту функцию соответствия preg, чтобы взять то, что мне нужно, но кажется, что я не с regerx в начале (?). Любые советы:

preg_match('#/(?:.*?).htm#is', $row['links'], $vardas); 
$vardas = $vardas[0]; 

ответ

2

Вы на самом деле соответствует первому /, а затем любые 1+ гольцов до первого htm.

Я считаю, что вам нужно

#/([^/]*)\.html?$#i 

Смотрите regex demo

Детали:

  • / - буквальный /
  • ([^/]*) - Группа 1 отлов 0+ обугливается, кроме/
  • \. - буквальный .
  • html? - html или htm
  • $ - конец строки

Разновидность узора для preg_filter (в случае, если вы передадите массив строк):

$urls = array("www.website.com/games/RANDOM-URL-TITLE-NOT_NEEDED.xhtml", 
    "www.website.com/games/randomcode1/RANDOM-URL-TITLE-NEEDED.html", 
    "www.website.com/blabla/randomcode2/RANDOM-URL-TITLE-NEEDED2.htm", 
    "www.website.com/whatever/randomcode2/RANDOM-URL-TITLE-NEEDED3.html"); 

print_r(preg_filter('#^.*/(.*)\.html?$#i', '$1', $urls)); 

Просмотреть PHP demo только возвращение

[1] => RANDOM-URL-TITLE-NEEDED 
[2] => RANDOM-URL-TITLE-NEEDED2 
[3] => RANDOM-URL-TITLE-NEEDED3 

Обновленный шаблон регулярного выражения соответствует:

  • ^ - начало строки
  • .*/ - 0+, кроме символа новой строки как можно больше до последнего / символов и сама косая черта
  • (.*) - Группа 1, захватывающая любые символы 0+, отличные от новой строки, как можно дольше
  • \.html? - .htm или .html подстроки ...
  • $ - конец строки.

$1 - это обратная ссылка на значение, полученное в Группе 1.

+1

Спасибо большое за preg_filter !!! Ты лучший! – DadaB

+0

Я вижу, я добавил объяснение обновленного регулярного выражения, используемого внутри 'preg_filter'. –

2

Более изящный способ без использования регулярных выражений:

echo pathinfo($url)['filename']; 

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

  • Нет связанных вопросов^_^