正则表达式从字符串中删除开始和结束字符?

时间:2010-05-26 21:44:14

标签: php regex

假设我有一个像这样的字符串:

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

我想使用preg_replace()删除前缀widget-并删除后缀.php。是否可以使用一个正则表达式来实现这一切?

结果字符串应为widget-newsletter

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:4)

为什么不使用substr?更简单,更快捷。

答案 2 :(得分: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);

那会快得多,但是如果你把垃圾扔掉,你就会得到垃圾回收。

答案 3 :(得分:1)

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

应该这样做。

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

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

如果您提供了一系列模式和一系列替换函数,那么每个模式都会被替换为替换。

<强>更新

当您删除-替换_的要求时,substr()确实更适合:

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

答案 4 :(得分:0)

来自替换参数的the manual描述:

  

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

听起来你可以使用带有前缀和后缀模式的数组作为pattern参数,只需将空字符串作为替换。