30.06.2012, 13:00
|
Новичок на форуме
|
|
Регистрация: 30.06.2012
Сообщений: 6
|
|
Логика регулярных выражений
Товарищи форумчане! Помогите, пожалуйста, понять логику работы регулярки на данном примере:
На вход подается ссылка на картинку определенного формата. На выходе должна выйти ссылка без протокола и query_string.
Пример: подаем http://site.ru/folder/picture.jpg?query&string или https://site.ru/folder/picture.jpg
На выходе получаем site.ru/folder/picture.jpg
Код:
if(document.getElementById('element_input').value.toLowerCase().indexOf('://', 0) > -1){
picture = document.getElementById('element_input').value.match(/\:\/\/(.+?)\.(jpg|jpeg|png|bmp|gif)/i);
}else{
picture = document.getElementById('element_input').value.match(/(.+?)\.(jpg|jpeg|png|bmp|gif)/i);
}
// на выходе picture[1] + "." + picture[2]
Да, этот код рабочий, но.. можно его как-то усовершенствовать убрав поиск через indexOf и переместив его в само регулярное выражение?
Попытки вроде
picture = document.getElementById('element_input').value.match(/(?:\:\/\/)??(.+?)\.(jpg|jpeg|png|bmp|gif)/i);
возвращают picture[1] вместе с возможным ://, а так быть не должно (должна быть "чистая" ссылка на картинку).
Собственно вопросы:
1. Почему picture[1] захватывает ://?
2. Как это исправить?
Заранее спасибо!
|
|
30.06.2012, 13:54
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Overflow,
Приведите реальные примеры двух трёх входных строк и что желаем видеть на выходе
|
|
30.06.2012, 22:36
|
Новичок на форуме
|
|
Регистрация: 30.06.2012
Сообщений: 6
|
|
input: http://cs315420.userapi.com/v3154206...u-OE.jpg?ololo
output: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg
input: https://cs315420.userapi.com/v315420...?ololo&trololo
output: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg
input: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo
output: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg
input: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jPg
output: cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jPg
т.е. на входе любая ссылка на любую картинку в интернете. Ссылка обрабатывается и сохраняется, а протокол и всё, что после формата - откидываются.
Последний раз редактировалось Overflow, 30.06.2012 в 23:04.
|
|
30.06.2012, 23:12
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
<script type="text/javascript">
function InputTST(select) {
var str = document.getElementById(select).value;
str2=str.replace(/\s*(?:http:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
if(RegExp["$2"]!='') return str2;
return false;
}
</script>
<input size="73" id="element_input" type="text" value=" cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo" /> <button type="button" onclick="alert('\''+InputTST('element_input')+'\'')">Test</button>
Последний раз редактировалось Deff, 30.06.2012 в 23:21.
|
|
01.07.2012, 01:36
|
Новичок на форуме
|
|
Регистрация: 30.06.2012
Сообщений: 6
|
|
Спасибо за ответ! Не подскажите, почему часть с http
str2=str.replace(/(?:http:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
работает на ура, а с отслеживанием "://" без символов букв
str2=str.replace(/(?:\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
"бракует" ("http://" помещается в $1, первая группировка её не видит)? Интересует именно почему :// игнорируются первым группированием, а если группировать http:// - то нет.
|
|
01.07.2012, 02:17
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Overflow
|
"бракует" ("http://" помещается в $1, первая группировка её не видит)? Интересует именно почему :// игнорируются первым группированием, а если группировать http:// - то нет.
|
Ничо не понял - приведите входные варианты и выходные
Может так ?
str2=str.replace(/(?:.*?:?\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
Последний раз редактировалось Deff, 01.07.2012 в 03:08.
|
|
01.07.2012, 10:37
|
что-то знаю
|
|
Регистрация: 24.05.2009
Сообщений: 5,176
|
|
Сообщение от Overflow
|
"бракует" ("http://" помещается в $1, первая группировка её не видит)? Интересует именно почему :// игнорируются первым группированием, а если группировать http:// - то нет.
|
потому что вы делаете replace а не match
var a = "http://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo";
alert( a.replace( /(?:http(?:s)?)?(?::\/\/)?(.*?\.(?:jpg|jpeg|png|bmp|gif)).*/gi, '$1' ) );
var a = "https://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo";
alert( a.replace( /(?:http(?:s)?)?(?::\/\/)?(.*?\.(?:jpg|jpeg|png|bmp|gif)).*/gi, '$1' ) );
var a = "://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo";
alert( a.replace( /(?:http(?:s)?)?(?::\/\/)?(.*?\.(?:jpg|jpeg|png|bmp|gif)).*/gi, '$1' ) );
var a = "cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo";
alert( a.replace( /(?:http(?:s)?)?(?::\/\/)?(.*?\.(?:jpg|jpeg|png|bmp|gif)).*/gi, '$1' ) );
|
|
01.07.2012, 12:20
|
Новичок на форуме
|
|
Регистрация: 30.06.2012
Сообщений: 6
|
|
devote, Deff, спасибо за ответы!
Сообщение от devote
|
потому что вы делаете replace а не match
|
Пример:
<script type="text/javascript">
function InputTST(select) {
var str = document.getElementById(select).value;
str2=str.replace(/(?:.*\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2');
//str2=str.replace(/(?:\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2');
if(RegExp["$2"]!='') return str2;
return false;
}
</script>
<input size="73" id="element_input" type="text" value="https://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo" /> <button type="button" onclick="alert('\''+InputTST('element_input')+'\'')">Test</button>
Но ведь если убрать .* в первой группе регулярка будет работать только тогда, когда :// будут в начале строки. Почему так? Ведь я /^ в начале не указывал? Пример:
<script type="text/javascript">
function InputTST(select) {
var str = document.getElementById(select).value;
//str2=str.replace(/(?:.*\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2');
str2=str.replace(/(?:\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2');
if(RegExp["$2"]!='') return str2;
return false;
}
</script>
<input size="73" id="element_input" type="text" value="https://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo" /> <button type="button" onclick="alert('\''+InputTST('element_input')+'\'')">Test</button>
Аналогично и с mathes (что я делаю не так?):
<script type="text/javascript">
function InputTST(select) {
var str = document.getElementById(select).value;
//str2=str.replace(/(?:.*\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
//str2=str.replace(/(?:\:\/\/)?(.*)\.(jpg|jpeg|png|bmp|gif).*$/ig,'$1.$2'); //
var matches = str.match(/(?:\:\/\/)?(.+)\.(jpg|jpeg|png|bmp|gif)/i);
return matches[2] ? (matches[1] + "." + matches[2]) : false;
}
</script>
<input size="73" id="element_input" type="text" value="https://cs315420.userapi.com/v315420616/2bf/V7iMAyfu-OE.jpg?ololo&trololo" /> <button type="button" onclick="alert('\''+InputTST('element_input')+'\'')">Test</button>
|
|
01.07.2012, 13:23
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Overflow,
У devote, правильный вариант, посколь я тещу лишь наличие расширение, а devote выдаёт строку - если есть и расширения и начальные варианты строки
|
|
01.07.2012, 20:28
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от Overflow
|
Да, этот код рабочий, но.. можно его как-то усовершенствовать убрав поиск через indexOf и переместив его в само регулярное выражение?
|
Зачем регулярное выражение, если можно, как Вы уже обозначили "дешево и сердито"?
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
|
|