2014-10-06 3 views
0

Как я могу сделать RegEx для удаления всего, от последнего подчеркивания до .jpg расширения в именах файлов?Регулярное выражение для имени файла

E.g. У меня есть

aosta_8b08e16ae42367d29cbf11bcf27f376a.jpg 
aosta_madreperla_014cb17607a4fb23fcb94a8f26efb267.jpg 

и нужно изменить его к этому

aosta.jpg 
aosta_madreperla.jpg 

Спасибо

ответ

3

Удалить совпавшие те или заменены пустой строкой

_[^_]*(?=\.) 

Online demo

шаблон Объяснение:

_      '_' 

    [^_]*     any character except: '_' (0 or more times) 
    (?=      look ahead to see if there is: 
    \.      '.' 
)      end of look-ahead 

Подробнее о Lookahead and Lookbehind Zero-Length Assertions, которые не потребляют символов в строке, но только утверждать, возможно ли совпадение или нет.

0

Regex:

^(.*)_[^.]* 

Замена строки:

$1 

DEMO

Объяснение:

  • ^(.*)_ захватывает все символы от начала Шифрование до последнего _ символ (за исключением подчеркивания) и сохранить его в группу 1.
  • [^.]* Соответствует любому но не точечного нуля или более раз.
  • Наконец все совпавшие символы заменяются символами внутри индекса группы 1.
0

Вы можете просто сделать это, используя это регулярное выражение

/[^_]+.jpg$/ 

и заменить .jpg

0
_(?!.*?_).*?(?=\.) 

Попробуйте this.Replace by `` .See demo.

http://regex101.com/r/hQ1rP0/18

_ соответствует символу _ буквально

(?!.*?_) отрицательного предпросмотра - утверждающие, что это невозможно, чтобы соответствовать строка, содержащая _.

(?=\.) Positive Lookahead - убедитесь, что строка заканчивается, когда перед ней стоит ..

0

Вам не нужно использовать регулярное выражение, используйте только substr и strpos, оно должно быть быстрее.

$str = array(
    'aosta_8b08e16ae42367d29cbf11bcf27f376a.jpg',  
    'aosta_madreperla_014cb17607a4fb23fcb94a8f26efb267.jpg' 
); 

foreach ($str as $s) { 
    echo substr($s, 0, strrpos($s, '_')) . substr($s, -4); 
    echo '<br>'; 
} 
Смежные вопросы