Php 用于删除下划线和字符串的正则表达式

Php 用于删除下划线和字符串的正则表达式,php,regex,Php,Regex,我需要使用PHP正则表达式从这个url的末尾删除“_normal” _normal.jpeg 使它成为 我试过了 $prof_img = preg_replace('_normal', '', $prof_img); 但下划线似乎有点不对劲。尝试使用str\u replace;对于这样的东西,它比正则表达式更有效 但是,如果要使用正则表达式,则需要分隔符: preg_替换“| | |”,$url 尝试使用stru\u替换;对于这样的东西,它比正则表达式更有效 但是,如果要使用正则表达式,则需

我需要使用PHP正则表达式从这个url的末尾删除“_normal”

_normal.jpeg

使它成为

我试过了

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

但下划线似乎有点不对劲。

尝试使用str\u replace;对于这样的东西,它比正则表达式更有效

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


preg_替换“| | |”,$url

尝试使用stru\u替换;对于这样的东西,它比正则表达式更有效

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

preg_替换“| | |”,$url

str_替换应该可以工作

$prof_img = str_replace('_normal', '', $prof_img);
str_替换应该可以工作

$prof_img = str_replace('_normal', '', $prof_img);
正如其他人所说,str_replace可能是这个简单示例的最佳选择

特定代码的问题是您的正则表达式字符串不受限制,您需要改为:

$prof_img = preg_replace('/_normal/', '', $prof_img);
请参阅以获取参考

下划线在PCRE中被视为一个普通字符,不会造成任何错误

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

$prof_img = preg_replace('/_normal(\.[^\.]+)$/', '$1', $prof_img);
请参阅以获取有关如何工作的更多信息。

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

特定代码的问题是您的正则表达式字符串不受限制,您需要改为:

$prof_img = preg_replace('/_normal/', '', $prof_img);
请参阅以获取参考

下划线在PCRE中被视为一个普通字符,不会造成任何错误

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

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

有关如何工作的更多信息,请参阅。

您刚刚忘记在正则表达式周围添加分隔符

使用PCRE功能时,要求图案为 用分隔符括起来。分隔符可以是任何非字母数字, 非反斜杠、非空白字符

常用的分隔符是正斜杠/、散列符号和 蒂尔德斯~。以下是所有有效分隔符的示例 模式


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

使用PCRE功能时,要求图案为 用分隔符括起来。分隔符可以是任何非字母数字, 非反斜杠、非空白字符

常用的分隔符是正斜杠/、散列符号和 蒂尔德斯~。以下是所有有效分隔符的示例 模式


您可以先使用分解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']
);
您可能会注意到您的表达式和我的表达式之间的两个差异:

你的没有定界

我的是锚定的,也就是说,如果它出现在文件名的末尾,它只会删除_normal


您可以先使用分解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']
);
您可能会注意到您的表达式和我的表达式之间的两个差异:

你的没有定界

我的是锚定的,也就是说,如果它出现在文件名的末尾,它只会删除_normal


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

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

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

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

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

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

是否启用了错误报告?是否启用了错误报告?是否可以解释正则表达式正在做什么?它将用空字符串替换文本字符串\u normal。管道是分隔符。你能解释一下你的正则表达式在做什么吗?它正在用一个空字符串替换文本字符串。管道|是分隔符。这将匹配url中的任何|正常值;也许这不是问题,但仅供参考。这将匹配url中的任何正常值;也许这不是问题,但仅供参考。