2010-05-26 3 views
3

Скажем, у меня есть строка, например, так:Регулярное выражение для удаления начальных и конечных символов из строки?

$file = 'widget-widget-newsletter.php'; 

Я хочу использовать preg_replace(), чтобы удалить префикс widget- и удалить суффикс .php. Можно ли использовать одно регулярное выражение для достижения всего этого?

Итоговая строка должна быть widget-newsletter.

ответ

8
$file = preg_replace('/^widget-|\.php$/', '', $file); 
1
$name = preg_replace(array('%^widget-%', '%-%', '%\.php$%'), array('','_',''), $file); 

должен это сделать.

Или более общий (предполагая, что префикс переходит к первому - и суффикс начинается с последнего .):

$name = preg_replacearray('%^.*?-%', '%-%', '%\.(?!.*?\.).*?$%'), array('','_',''), $file); 

Если вы передадите массив шаблонов и множество замен к функции, то каждый шаблон заменяется соответствующей заменой.

Update:

Как вы убрали требование о замене - на _, substr() действительно лучше подходит:

$name = substr($file, 7, -4); 
4

Почему бы не использовать substr? Гораздо проще и быстрее.

+0

Спасибо, я действительно использовал ваше решение, но принял ответ Кугельмана. – John

0

Из the manual описания параметра замены:

Строка или массив строк для замены. Если этот параметр является строкой, а параметр pattern является массивом, все шаблоны будут заменены этой строкой.

Похоже, вы можете использовать массив с префиксом и шаблонами суффиксов в нем для параметра шаблона и просто поместить пустую строку в качестве замены.

2

Не думай об этом, как вырезают концы, а также извлечения середины:

$file = 'widget-widget-newsletter.php'; 
if (preg_match('/^widget\-(.+)\.php$/i', $file, $matches)) 
    echo "filename is " . $matches[1][0]; 

Конечно, если «widget-» и «.php» полностью статичным и всегда будут быть там, вы могли бы просто использовать substr:

echo "filename is " . substr($file, 7, -4); 

Это будет гораздо быстрее, но если вы передадите это мусор, вы получите мусор обратно.

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