Regex 在PHP中使用preg_replace转换字符串

Regex 在PHP中使用preg_replace转换字符串,regex,preg-replace,preg-match,Regex,Preg Replace,Preg Match,我有这根绳子 $string = "some words and then #1.7 1.7 1_7 and 1-7"; 我希望用S1E07替换1.7/1.7/1_7和1-7。 当然,不是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或类似的东西?要真正替换匹配项,使其最终像S1E

我有这根绳子

$string = "some words and then #1.7 1.7 1_7 and 1-7";
我希望用S1E07替换1.7/1.7/1_7和1-7。 当然,不是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一样,如果需要在数字小于10时填充0,则需要使用preg_replace_callback

如果数字小于10需要填充0,则需要使用preg_replace_callback


我相信这会做你想做的

/\#?([0-9]+)[._-]([0-9]+)/
换句话说

\? - 我们可以从 [0-9]+-捕获至少一个数字 [.-]-寻找一个- [0-9]+-捕获至少一个数字 然后你可以用这个来代替

S$1E$2

这将输出S,然后是第一个捕获的组,然后是E,然后是第二个捕获的组

我相信这将实现你想要的

/\#?([0-9]+)[._-]([0-9]+)/
换句话说

\? - 我们可以从 [0-9]+-捕获至少一个数字 [.-]-寻找一个- [0-9]+-捕获至少一个数字 然后你可以用这个来代替

S$1E$2

这将输出S,然后是第一个捕获的组,然后是E,然后是第二个捕获的组

您需要在要重用的零件周围放上括号==>捕获它们。然后,您可以使用$1或${1}访问替换字符串中的值,如果第一个组的组数超过9,第二个组的组数超过2

这里的问题是,您最终会得到$1-$8,因此我会将表达式重写为以下内容:

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

S${1}E${2}
我测试了它:


您需要在要重用的零件周围放置括号==>捕获它们。然后,您可以使用$1或${1}访问替换字符串中的值,如果第一个组的组数超过9,第二个组的组数超过2

这里的问题是,您最终会得到$1-$8,因此我会将表达式重写为以下内容:

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

S${1}E${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电话即可。

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

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

如果您不想填充季号,只需拨打第一个STRU pad电话。

您需要提供有关可能输入格式的更明确信息,以及这些输入如何影响输出。它会一直是1和7,还是不同的数字或不同长度的数字,例如23.456?输出是否基于这些值,如果是,那么7是否应该在小于10时用前导0填充?数字可以是1到99,因此可以是1.1到99.99。填充很好,但不是必须的。您需要提供有关可能输入格式的更明确信息,以及这些输入如何影响输出。它会一直是1和7,还是不同的数字或不同长度的数字,例如23.456?输出是否基于这些值,如果是,那么7是否应该在小于10时用前导0填充?数字可以是1到99,因此可以是1.1到99.99。填充很好,但不是必须的。谢谢!你的正则表达式肯定比我的更优雅,结果是预期的。唯一的一点是它也会匹配1999.12之类的东西,这是我不想要的。我尝试过使用\d{1,2},但我会使用单词边界返回19S99E12\b您应该能够实现这一点。看看我的答案。是的,你的答案很好,而且几乎完美。只是如果我这样使用\b/\b?\d{1,2}[.\u-]\ d{1,2}/我会得到S1E07My bad,把单词边界放在后面?你们都准备好了。喜欢吗?\b\d……谢谢!你的正则表达式肯定比我的更优雅,结果是预期的。唯一的一点是它也会匹配1999.12之类的东西,这是我不想要的。我尝试过使用\d{1,2},但我会使用单词边界返回19S99E12\b您应该能够实现这一点。看看我的答案。是的,你的答案很好,而且几乎完美。只是如果我这样使用\b/\b?\d{1,2}[.\u-]\ d{1,2}/我会得到S1E07My bad,把单词边界放在后面?你们都准备好了。像?\b\d。。。