【问题标题】:Replace all the _ except one before last one替换除最后一个之前的所有 _
【发布时间】:2013-09-09 16:36:04
【问题描述】:

我有以下网址:

http://distilleryimage3_s3_amazonaws_com/8af11cdcf11e286b022000ae90285_7_jpg

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

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

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

如果我使用 str_replace 它将替换所有 _ 但我需要保留那个。我该怎么做?

【问题讨论】:

  • 你从哪里得到这个输入?
  • 为什么不替换到第一个'/'斜线。斜线后面的任何内容都保留。完成后,从头开始,将单个 _ 替换为 .
  • 查看这个问题的解决方案:stackoverflow.com/questions/8510223/… - 您可以使用 substr_count 来获取总出现次数并减去 1 来获得您的限制
  • URL 是如何被破坏的?怎么样,首先不要用下划线替换点。
  • 这个只能用一次吗?如果不是,您如何确定每次都需要保留完全相同的下划线?

标签: php regex


【解决方案1】:

使用这个(现在更正了!

<?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

【讨论】:

  • 如果它是一个随机数而不是放在末尾的 7 怎么样?
  • 这只会修复这个特定的字符串。 OP 想要一个适用于所有可能的 AWS url 的通用解决方案。
  • @TiagoSouEu 现在应该可以工作了(当然,在某些情况下它会失败)。
  • @TiagoSouEu 我进行了另一次更新,该模式替换了所有下划线,除了下划线后跟一个数字、另一个下划线和“jpg”。这符合您的要求吗?
  • 您的正则表达式没有捕获组\2
【解决方案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

Demo!

【讨论】:

  • 如果url后面还有其他点.怎么办?
  • @randunel:域名扩展无关紧要。而且我看不出图像 URL 怎么可能有多个点。
  • 您没有见过名为my.super.cat.jpg 的文件吗?这是可能的。我可以通过任何网址提供任何服务,包括example.com/my.super.dotted.endpoint
  • @randunel:是的,在那种情况下它会失败,但 OP 没有提到它,所以我只是采用了一个通用的解决方案,它适用于 most 的 URL。总是有可能找到例外;)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

     _(?=[^_]+$)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 2012-12-29
      • 2020-12-28
      • 2022-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多