正则表达式删除下划线和字符串

时间:2013-06-16 23:59:39

标签: php regex

我需要使用PHP正则表达式来删除此网址末尾的“_normal”。

http://a0.twimg.com/profile_images/3707137637/8b020cf4023476238704a9fc40cdf445 _normal .JPEG

这样就变成了

http://a0.twimg.com/profile_images/3707137637/8b020cf4023476238704a9fc40cdf445.jpeg

我试过

$prof_img = preg_replace('_normal', '', $prof_img);

但是下划线似乎是在抛弃它。

6 个答案:

答案 0 :(得分:7)

正如其他人所说,str_replace可能是这个简单例子的最佳选择。

您的特定代码的问题在于您的正则表达式字符串是无限制的,您需要这样做:

$prof_img = preg_replace('/_normal/', '', $prof_img);

请参阅PCRE regex syntax以获取参考。

下划线被视为PCRE中的正常角色,并不会丢掉任何东西。

如果您要求只匹配文件名末尾的_normal,您可以使用:

$prof_img = preg_replace('/_normal(\.[^\.]+)$/', '$1', $prof_img);

有关其工作原理的详情,请参阅preg_replace

答案 1 :(得分:3)

尝试使用str_replace;对于像这样的东西,它比正则表达式更有效。

但是,如果要使用正则表达式,则需要使用分隔符:

preg_replace('|_normal|','', $url);

答案 2 :(得分:3)

str_replace应该有用。

$prof_img = str_replace('_normal', '', $prof_img);

答案 3 :(得分:1)

您只是忘了在正则表达式周围添加分隔符。

http://www.php.net/manual/en/regexp.reference.delimiters.php

  

使用PCRE功能时,需要使用模式   由分隔符括起来。分隔符可以是任何非字母数字,   非反斜杠,非空白字符。

     

经常使用的分隔符是正斜杠(/),哈希符号(#)和   波浪(〜)。以下是有效分隔的所有示例   图案。

$prof_img = preg_replace('/_normal/', '', $prof_img);

$prof_img = preg_replace('#_normal#', '', $prof_img);

$prof_img = preg_replace('~_normal~', '', $prof_img);

答案 4 :(得分:0)

您可以先使用分解URL,进行替换并将它们粘在一起,即

$url = 'http://a0.twimg.com/profile_images/3707137637/8b020cf4023476238704a9fc40cdf445_normal.jpeg';

$parts = pathinfo($url);
// transform
$url = sprintf('%s%s.%s', 
     $parts['dirname'],
     preg_replace('/_normal$/', '', $parts['filename']),
     $parts['extension']
);

你可能会注意到你的表达与我的两个不同之处:

  1. 你的未被分隔。

  2. Mine已锚定,即如果它出现在文件名的 end ,它只会删除_normal

答案 5 :(得分:0)

使用非捕获组,您也可以尝试这样:

$prof_img = preg_replace('/(.+)(?:_normal)(.+)/', '$1$2', $prof_img);

它会将所需部分保持匹配。