-1

我有以下网址:

http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg

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

所以,基本上它应该看起来像:

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

如果我使用 str_replace 它将替换所有_但我需要保留那个。我怎样才能做到这一点?

4

4 回答 4

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
于 2013-09-09T16:41:18.783 回答
2

这是一个不使用正则表达式的解决方案(适用于所有数字,因此如果数字不同于 ,这不会失败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

演示!

于 2013-09-09T17:15:45.927 回答
1

您可以使用这个基于负前瞻的正则表达式代码:

$s='http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg';
$repl = preg_replace('/_(?![^_]*_[^_]*$)/', '.', $s);
//=> http://distilleryimage3.s3.amazonaws.com/8af11cdcf11e286b022000ae90285_7.jpg
于 2013-09-09T16:46:13.970 回答
0

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

 _(?=[^_]+$)

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

于 2013-09-09T17:59:48.757 回答