如何使用正则表达式从字符串中删除开头和结尾的字符?

4

假设我有一个字符串:

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

我想使用 preg_replace() 函数来移除前缀 widget- 和后缀 .php。是否可以使用一个正则表达式来实现这一点?
最终的字符串应该是widget-newsletter
5个回答

10
$file = preg_replace('/^widget-|\.php$/', '', $file);

5
为什么不使用 substr 呢?更加简单快捷。

谢谢,我实际上使用了您的解决方案,但接受了Kugelman的答案。 - John

3

不要把它看作是剥去端部,而是提取中间部分:

$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);

这样做会更快,但如果你传入垃圾数据,你会得到垃圾数据的返回结果。


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

应该这样做。

或更一般地(假设前缀到第一个-,后缀从最后一个.开始):

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

如果您将模式数组和替换数组提供给函数,则每个模式都会被相应的替换所替换。

更新:

由于您删除了将-替换为_的要求,因此substr()确实更适合:

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

0

手册的替换参数描述中:

要替换的字符串或字符串数组。如果此参数是字符串且模式参数是数组,则所有模式都将被该字符串替换。

听起来您可以使用包含前缀和后缀模式的数组作为模式参数,并将空字符串作为替换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接