Я хочу сопоставить расширение файла во всех следующих 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
Как мне это сделать?
Я пробовал это, но это не работает:
([^\.]+)(\?|[^\?]$)+
Это была бы версия, которую я бы использовал
/\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);
Для соответствия попробуйте эту функцию без учета регистра:
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
<?
$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
)
)