如何在 PHP 中用已经编号替换字符串



我在文本文件中有很多列表,如下所示:

001.Porus.2017.S01E01.The.Epic.Story.Of.A.Warrior.720.x264.mp4
002.Porus.2017.S01E01.Welcome.With.A.Fight.720.x264.mp4
003.Porus.2017.S01E01.Anusuya.Stays.in.Poravs.720.x264.mp4
004.Porus.2017.S01E01.Olympia.Prays.For.A.Child.720.x264.mp4
.................

我想用每个列表前面的数字替换S01E01中的所有E01。我想要的输出:

001.Porus.2017.S01E001.The.Epic.Story.Of.A.Warrior.720.x264.mp4
002.Porus.2017.S01E002.Welcome.With.A.Fight.720.x264.mp4
003.Porus.2017.S01E003.Anusuya.Stays.in.Poravs.720.x264.mp4
004.Porus.2017.S01E004.Olympia.Prays.For.A.Child.720.x264.mp4

......................

顺便说一句,我正在使用以下代码;

$list = file("list.txt", FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$string = "";
foreach($list as $index => $entry)
{
   $string .= str_pad($index + 1, 3, '0', STR_PAD_LEFT) . "." . $entry . ", ";
}
$string = substr($string, 0 , -2);
$get = explode(",", $string);
$phr = implode("<br>", array_values(array_unique($get)));
print_r($phr); 
<pre>
<?php 
$arr = [
            '001.Porus.2017.S01E01.The.Epic.Story.Of.A.Warrior.720.x264.mp4',
            '002.Porus.2017.S01E01.Welcome.With.A.Fight.720.x264.mp4',
            '003.Porus.2017.S01E01.Anusuya.Stays.in.Poravs.720.x264.mp4',
            '004.Porus.2017.S01E01.Olympia.Prays.For.A.Child.720.x264.mp4'
        ];
$your_next_number = "some_number";
$modified_values = [];
foreach($arr as $each_value){
    $modified_values[] = str_replace("S01E01","S01".$your_next_number,$each_value);
    //$your_next_number = something;some change that you want to make to your next iterable number.
}
print_r($modified_values);

输出

Array
(
    [0] => 001.Porus.2017.S01some_number.The.Epic.Story.Of.A.Warrior.720.x264.mp4
    [1] => 002.Porus.2017.S01some_number.Welcome.With.A.Fight.720.x264.mp4
    [2] => 003.Porus.2017.S01some_number.Anusuya.Stays.in.Poravs.720.x264.mp4
    [3] => 004.Porus.2017.S01some_number.Olympia.Prays.For.A.Child.720.x264.mp4
)

更新

您可以将 foreach 中的代码替换为以下代码。 感谢@ArtisticPhoenix提供这种即兴创作和解释。

foreach($arr as $each_value){
    $modified_values[] = preg_replace('/^(d+)([^S]+)(S01E)(d+)/', '1231', $each_value);
}
  • ^(d+) => 这是group 1.捕获(开头的^(和数字(\d(一个或 更多 (+(。

  • ([^S])+ => 这是group 2 .捕获除大写字母 S ([^S]( 一个或多个 (+( 之外的任何内容。

  • (S01E) => 这是group 3.按原样捕获 S01E。

  • (d+) - 这是group 4.捕获 (S01E( 之后的数字。

请注意,组号具有基于1索引,因为组0是整个正则表达式。

更换部件:

  • 替换是1231 .
  • integer(表示组号(语法称为反向引用。这表示匹配您获得的同一组字符 从匹配该组。
  • 因此,将第 1 次、 2和第 3捕获放回位置 他们来自,然后第 4 次捕获替换为第 1 次,这是 替换匹配项中最后一位数字的初始数字。

那么,让我们以001.Porus.2017.S01E01.The.Epic.Story.Of.A.Warrior.720.x264.mp4为例——

(d+)([^S]+)(S01E)(d+)这样匹配=>(001)(.Porus.2017.)(S01E)(01)

因此,替换使其(001)(.Porus.2017.)(S01E)(001)(请注意最后一次更改,因为替换1231末尾的1。无论如何,字符串的其余部分保持不变。

最新更新