Предположим, у меня есть строка вроде:
$file = 'widget-widget-newsletter.php';
Я хочу использовать preg_replace () для удаления widget-
префикса и удалить суффикс .php
. Можно ли использовать одно регулярное выражение для достижения всего этого?
Полученная строка должна быть widget-newsletter
.
$file = preg_replace('/^widget-|\.php$/', '', $file);
Почему бы не использовать substr
? Гораздо проще и быстрее.
Не думайте об этом как об отрыве концов, а как об извлечении середины:
$file = 'widget-widget-newsletter.php'; if (preg_match('/^widget\-(.+)\.php$/i', $file, $matches)) echo "filename is " . $matches[1][0];
Конечно, если «widget-» и «.pp» полностью статичны и всегда будут там, вы можете просто использовать substr
:
echo "filename is " . substr($file, 7, -4);
Это было бы намного быстрее, но если вы передадите этот мусор, вы вернете мусор.
$name = preg_replace(array('%^widget-%', '%-%', '%\.php$%'), array('','_',''), $file);
должен это сделать.
Или более общий (при условии, что префикс переходит к первому -
и суффикс начинается с последнего .
):
$name = preg_replacearray('%^.*?-%', '%-%', '%\.(?!.*?\.).*?$%'), array('','_',''), $file);
Если вы предоставляете массив шаблонов и массив замен для функции, то каждый шаблон заменяется соответствующей заменой.
Обновить:
Когда вы удалили требование заменить -
на _
, substr()
действительно лучше подходит:
$name = substr($file, 7, -4);
Из ручного описания параметра замены:
Строка или массив со строками для замены. Если этот параметр является строкой, а параметр pattern является массивом, все шаблоны будут заменены этой строкой.
Похоже, вы можете использовать массив с шаблонами префикса и суффикса в нем для параметра шаблона и просто поместить пустую строку в качестве замены.