2015-12-13 3 views
5

Мне интересно, есть ли регулярное выражение, которое я могу использовать для поиска расширений файлов с помощью базового html.Регулярное выражение для расширения файла

Прямо сейчас у меня есть

<img src="images/pimage/{$item['item_id']}/small.jpg"> 

Проблема не все мои изображения заканчиваются .jpg.

Так что я хотел бы регулярное expresion, который может найти все изображения, которые начинаются с малого и закончить в .jpg, .jpeg, .JPG, .png, .gif и т.д ... и в нижнем регистре и верхнем регистре.

Есть ли простое регулярное выражение, которое я могу положить после «малого», чтобы найти все соответствующие файлы?

Я не уверен, что я делаю неправильно, но когда я пробую какое-либо из предложений, вывод показывает только регулярное выражение, а не предполагаемые результаты. вот мой текущий код

 function print_item($item,$link_change){ 
     $acticon= ($item['active']==TREEMAN_ITEM_ACTIVE)? 'active.gif' : 'disabled.gif'; 
     $tmpl_act=($this->section->webmode)? "<td><img src=\"".ADMIN_IMG_PATH."icons/{$acticon}\"></td>" : ""; 
     $tmpl_date=date('Y-m-d H:i',$item['cdate']); 
     $tmpl_added_by=$item['added_by']; 
     $tmpl_modified_by=$item['modified_by']; 
//  $tmpl_date_mod=date('Y-m-d H:i',$item['timestamp']); 
     $tmpl_date_mod=$item['timestamp']; 
     $res=<<<EOT 
<td >{$item['item_id']}</td> 
<td><a href="{$link_change}"</a><img src="/img/ucart/images/pimage/{$item['item_id']}/small.jpg" height="75" width="75"</td> 
<td class="tb" width="50%"><a href="{$link_change}" title="Edit item">{$item['item_name']}</a></td> 
<td>$tmpl_date</td> 
<td>$tmpl_date_mod</td> 
<td>$tmpl_added_by</td> 
<td>$tmpl_modified_by</td> 
$tmpl_act 
EOT; 

любая идея, что я делаю неправильно?

+1

Для уточнения, вы пытаетесь вернуть имя файла 'small-filename.jpg' или регулярное выражение, чтобы получить полный путь к файлу, например. 'images/pimage/27/small-filename.jpg'? – femmestem

+0

Все имена файлов - маленькие. Некоторые из них small.jpg, некоторые small.JPG, small.png, small.gif и т. Д. – Robert

ответ

2

Регулярное выражение, чтобы захватить все изображения, которые начинаются с "малой" и конца в любом расширении, что вы перечислили:

/^small.*\.(jpe?g|gif|png|tiff)$/i

Условия Разъяснения:

^ - начинается с

.* - соответствует 0 или более символов

\. - соответствует периоду; \ - символ перехода, который означает, что следующий символ следует интерпретировать буквально, что необходимо, потому что символы ., ?, + и т. Д. Имеют смысл в регулярном выражении иначе.

(a|b|c) - соответствует ничего, содержащейся внутри скобок (например, соответствует, если следующий символ a или b или c)

? - означает, что предыдущий символ может появиться ноль или один раз (например, jpe?g матчи " JPEG», потому что он содержит один„е“, а также соответствует„JPG“, потому что„е“появляется ноль раз в этом положении)

$ - обозначает конец шаблона к сопоставлению

/your-regex-pattern/i - нечувствительны к регистру матчей (верхние и нижний регистр)

Если вы хотите узнать больше о шаблоне в регулярных выражениях, проверить это удобный Cheatsheet: http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/

+0

Сбой для любого файла, содержащего период, отличный от того, который был до расширения (например, 'small.heart.png' не будет работать хотя это действительное имя файла). Кроме того, конец должен быть '(jpg | jpeg | gif | png | tiff)' (используя скобки, а не скобки). Наконец, вам может быть разумно указать '$' в конце шаблона, чтобы убедиться, что не существует никаких символов, следующих за предполагаемым расширением файла (например, ваши текущие шаблоны будут успешными для чего-то вроде: 'small.jpg.php' или все, что следует за правильным расширением изображения). – SpencerD

+0

@SpencerDoak Спасибо, что поймали '[]' vs '()'. Что касается крайних случаев с именами файлов, я полностью согласен с вами, но я не учитывал их, потому что OP дал нам представление о том, как выглядят имена файлов. – femmestem

+3

Еще одна вещь: 'jpg | jpeg' можно сократить до' jpe? G' – Gary

0

Согласно this page from www.Regular-Expressions.info, чувствительности к регистру и другим подобным matching- флаги/параметры обычно реализуются на языке программирования, а не непосредственно в самом шаблоне. Тем не менее, в том случае, если язык не предоставляет возможность передавать флаги соответствия/опции, связанная выше страница RegEx указывает, что в шаблоне могут быть указаны такие параметры, как нечувствительность к регистру.

Чтобы указать шаблон как нечувствительный к регистру, вы можете указать (?i) как начало нечувствительной к регистру части и (?-i) как конец участка без учета регистра.

Для вашей конкретной ситуации это означает, что следующий шаблон RegEx может быть эффективным: \.(?i)(png|gif|jpg|jpeg|ico|bmp|svg|tiff)(?-i)$ Очевидно, что вы захотите изменить этот шаблон на свои нужды, чтобы добавить или удалить типы файлов изображений.

В этом шаблоне: \. обозначает символ буквального периода (.); (?i) отключает чувствительность к регистру для всех следующих частей; (png|gif|jpg|jpeg|ico|bmp|svg|tiff) обозначает список опций, то есть расширение файла должно быть одним (и только одним) из опций в списке; (?-i) включает чувствительность к регистру; и $ обозначает конец строки, то есть не может быть никаких символов, следующих за расширением файла.

Если язык, который вы используете, поддерживает указание совпадающих флагов другим способом, то я бы посоветовал вам указать их любым способом, который рекомендует язык; однако, согласно приведенной выше странице информации RegEx, это правильный способ указать их в шаблоне (, который имеет преимущество не делать весь шаблон без учета регистра, если вы решите добавить больше к шаблону) ,

EDIT: как предупреждение, похоже, Javascript не поддерживает поворот чувствительности к регистру и выключается внутри самого шаблона (с использованием (?i) и (?-i)). Итак, если вы работаете с Javascript, вам придется обойти это, установив /i в качестве флага в конце вашего выражения или используя шаблон, такой как: \.([pP][nN][gG]|[jJ][pP][eE]?[gG]|[gG][iI][fF]|[iI][cC][oO]|[tT][iI][fF]{1,2})$. В этом шаблоне каждая буква в расширении указывается как в верхнем, так и в нижнем регистре. Это позволяет шаблону соответствовать расширению файла независимо от того, в каком случае он написан, но при этом остальная часть выражения чувствительна к регистру.

1

Возможно, это вам поможет?

/\.\w+$/ 

(точка знака и 1 (или более) символы класса слов в конце строки ввода)

или

/\.[a-z]+$/i 
/\.[a-zA-Z]+$/ 

(Знамения точки и 1 (или больше) буквы в конце строки ввода)

или

/\.[a-z]{1,4}$/i 
/\.[a-zA-Z]{1,4}$/ 

(знак точка и от 1 до 4 букв в конце строки ввода)

Заметим, что все опции имеет знак многоточия выпуска продукции.
Все регулярные выражения не чувствительны к регистру, так как есть i -flag.


Кроме того, к сожалению, JavaScript не поддерживает просмотра назад, поэтому регулярное выражение

/(?<=small\.)[a-z]+/i 

(1 или более букв после small. подстроки)

не будет работать; но, я думаю, это было бы лучшим регулярным выражением в этом случае.

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