Как сопоставить расширение файла в URL, который может заканчиваться строкой запроса?

Я хочу сопоставить расширение файла во всех следующих URL только до вопросительного знака. Таким образом, URL # 4 будет соответствовать pdf в «file.pdf», но не «exe» в «otherfile.exe».

http://www.someplace.com/directory/file.pdf
http://www.someplace.com/directory/file.pdf?otherstuff=true
http://www.someplace.com/directory/file.pdf?other=true&more=false
http://www.someplace.com/directory/file.pdf?other=true&more=false&value=otherfile.exe

Как мне это сделать?

Я пробовал это, но это не работает:

([^\.]+)(\?|[^\?]$)+

1

Решение

Это была бы версия, которую я бы использовал

/\w+\.[A-Za-z]{3,4}(?=\?|$)/

Вот рабочая версия:

http://regex101.com/r/sY2fR0/1

Использование смотреть вперед с любым? Или конец строки (?=\?|$) тогда вы можете соответствовать тому, что стоит за этим.

$re = "/\\w+\\.[A-Za-z]{3,4}(?=\\?|$)/";
$str = "http://www.someplace.com/directory/file.pdf?other=true&more=false&value=otherfile.exe\n\n";

preg_match($re, $str, $matches);
6

Другие решения

Для соответствия попробуйте эту функцию без учета регистра:

function matchURLs($desiredURL, $compareURL){
$url = parse_url($compareURL);
if(preg_match('/^'$url['scheme'].'://'.$url['host'].$url['path'].'$/i', $desiredURL)){
return true;
}
return false;
}
matchURLs('http://www.someplace.com/directory/file.pdf', 'http://www.someplace.com/directory/file.exe'); // false
matchURLs('http://www.someplace.com/directory/file.pdf', 'http://www.someplace.com/directory/file.pdf?value=file.exe'); // true

Чтобы просто получить до ?:

function URL_before_query($url){
$u = parse_url($url);
return $u['scheme'].'://'.$u['host'].$u['path'];
}
echo URL_before_query('http://www.someplace.com/directory/file.pdf?other=true&more=false&value=otherfile.exe'); // http://www.someplace.com/directory/file.pdf
0

<?
$str = '
http://www.someplace.com/directory/file1.pdf
http://www.someplace.com/directory/file2.pdf?otherstuff=true
http://www.someplace.com/directory/file3.pdf?other=true&more=false
http://www.someplace.com/directory/file4.pdf?other=true&more=false&value=otherfile.exe
';
$regex= '~.*/\K[^?\n]+~';

preg_match_all($regex, $str, $out, PREG_SET_ORDER);
print_r($out);
?>

Выход

Array (
[0] => Array (
[0] => file1.pdf
)
[1] => Array (
[0] => file2.pdf
)
[2] => Array (
[0] => file3.pdf
)
[3] => Array (
[0] => file4.pdf
)
)
0
По вопросам рекламы [email protected]