1

我需要使用 PHP 正则表达式从该 URL 的末尾删除“_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);

但下划线似乎把事情扔掉了。

4

6 回答 6

7

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

您的特定代码的问题是您的正则表达式字符串是未定界的,您需要这样做:

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

请参阅PCRE 正则表达式语法以获取参考。

下划线在 PCRE 中被视为一个正常字符,不会丢掉任何东西。

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

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

有关preg_replace其工作原理的更多信息,请参阅。

于 2013-06-17T00:04:15.990 回答
3

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

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

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

于 2013-06-17T00:02:27.607 回答
3

str_replace应该管用。

$prof_img = str_replace('_normal', '', $prof_img);
于 2013-06-17T00:02:37.620 回答
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);
于 2013-06-17T00:13:50.337 回答
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. 我的是锚定的,即只有在文件名末尾_normal出现时才会删除。

于 2013-06-17T01:55:40.707 回答
0

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

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

它将保留所需的部分作为匹配项。

于 2013-06-17T05:06:42.867 回答