在最后一个之前替换所有_除外

时间:2013-09-09 16:36:05

标签: php regex

我有以下网址:

http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg

我想将_替换为.。但是,应该保留最后的_7 - 它不是一个点。

所以,基本上应该是这样的:

http://distilleryimage3.s3.amazonaws.com/8af11cdcf11e286b022000ae90285_7.jpg

如果我使用str_replace它将替换所有_,但我需要保留那个。{1}}我怎么能这样做?

4 个答案:

答案 0 :(得分:2)

使用此功能(立即更正!

<?php
$subject = 'http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg';
$pattern = '/(_)(?!\d_jpg)/';


var_dump(preg_replace($pattern, '.', $subject));

此输出

http://distilleryimage3.s3.amazonaws.com/8af11cdcf11e286b022000ae90285_7.jpg

答案 1 :(得分:1)

您可以使用此否定前瞻为基础的正则表达式代码:

$s='http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg';
$repl = preg_replace('/_(?![^_]*_[^_]*$)/', '.', $s);
//=> http://distilleryimage3.s3.amazonaws.com/8af11cdcf11e286b022000ae90285_7.jpg

答案 2 :(得分:1)

这是一个不使用正则表达式的解决方案(适用于所有数字,因此如果数字与7不同,这不会失败;它不必是数字 - 字符串有效,也是):

 <?php

$haystack = 'http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg';

//replacing all '_' with '.'
$haystack = str_replace('_', '.', $haystack);

//finding second last occurence of '.'
$n = strrpos($haystack, '.', strrpos($haystack, '.') - strlen($haystack) - 1);

//replacing the nth character to '_'
$haystack[$n] = '_';

echo $haystack;

输出:

http://distilleryimage3.s3.amazonaws.com/8af11cdcf11e286b022000ae90285_7.jpg

Demo!

答案 3 :(得分:0)

字符串中的最后一个_本身不是。

 _(?=[^_]+$)

编辑:我的假设是这个问题需要特定的文件扩展知识才能正确回答。