如何在PHP中将字符串替换为已有的数字

时间:2018-08-08 06:38:34

标签: php regex

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

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

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

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); 

1 个答案:

答案 0 :(得分:0)

<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+)/', '\1\2\3\1', $each_value);
}
  • ^(\d+) =>这是group 1。捕获(开头的^)和数字(\ d)一个或 更多(+)。

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

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

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

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

替换零件:

  • 替换为\1\2\3\1
  • 语法\后跟integer(代表组号)称为反向引用。这表示与您获得的相同字符集匹配 从匹配该组。
  • 因此,将1 st ,2 nd 和3 rd 捕获放回 他们来自,然后将第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)(注意最后的更改是因为替换\1的末尾有\1\2\3\1。字符串的其余部分仍然保持不变。