1

我有这个字符串

$string = "some words and then #1.7 1.7 1_7 and 1-7";

我希望将#1.7/1.7/1_7 和 1-7替换为S1E07
当然,不是“1.7”只是一个例子,它可以是“3.15”。

我设法创建了匹配上述 4 个变体的正则表达式

/\#\d{1,2}\.\d{1,2}|\d{1,2}_\d{1,2}|\d{1,2}-\d{1,2}|\d{1,2}\.\d{1,2}/

但我无法弄清楚如何使用 preg_replace (或类似的东西?)来实际替换匹配项,因此它们最终会像S1E07

4

4 回答 4

3

如果数字小于,则需要preg_replace_callback填充。010

$string = "some words and then #1.7 1.7 1_7 and 1-7";
$string = preg_replace_callback('/#?(\d+)[._-](\d+)/', function($matches) {
  return 'S'.$matches[1].'E'.($matches[2] < 10 ? '0'.$matches[2] : $matches[2]);
}, $string);
于 2012-09-21T10:36:15.893 回答
2

您可以使用这个简单的字符串替换:

preg_replace('/#?\b(\d{1,2})[-._](\d{1,2})\b/', 'S${1}E${2}', $string);

但它不会为剧集编号产生零填充数字:

// some words and then S1E7 S1E7 S1E7 and S1E7

您将不得不使用评估修饰符:

preg_replace('/#?\b(\d{1,2})[-._](\d{1,2})\b/e', '"S".str_pad($1, 2, "0", STR_PAD_LEFT)."E".str_pad($2, 2, "0", STR_PAD_LEFT)', $string);

...并使用 str_pad 添加零。

// some words and then S01E07 S01E07 S01E07 and S01E07

如果您不希望填充季节编号,您可以拨打第一个 str_pad 电话。

于 2012-09-21T10:40:41.763 回答
1

我相信这会做你想要的......

/\#?([0-9]+)[._-]([0-9]+)/

换句话说...

  • \#?- 可以从#
  • ([0-9]+)- 至少捕获一位数字
  • [._-]- 找一个._或者-
  • ([0-9]+)- 至少捕获一位数字

然后你可以用它来代替...

S$1E$2

它将先放出S第一个捕获的组,然后放出E第二个捕获的组

于 2012-09-21T10:36:40.153 回答
1

您需要在要重用的部分周围加上括号 ==> 捕获它们。$1然后,您可以使用(或 ${1} 如果组超过 9)访问第一组的替换字符串中的这些值,$2对于第二组......

这里的问题是你最终会得到 $1 - $8,所以我会将表达式重写为如下所示:

/#?(\d{1,2})[._-](\d{1,2})/

并替换为

S${1}E${2}

我在writecodeonline.com上对其进行了测试:

$string = "some words and then #1.7 1.7 1_7 and 1-7";
$result = preg_replace('/#?(\d{1,2})[._-](\d{1,2})/', 'S${1}E${2}', $string);
于 2012-09-21T10:37:03.787 回答