1

私はこの文字列を持っています

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

#1.7 / 1.7/1_7と1-7S1E07に置き換えてほしい。
もちろん、「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]+)-少なくとも1桁をキャプチャします
  • [._-]-1つを探す._または-
  • ([0-9]+)-少なくとも1桁をキャプチャします

そして、これを使用して置き換えることができます...

S$1E$2

S次に、最初にキャプチャされたグループ、次に2E番目にキャプチャされたグループが出力されます

于 2012-09-21T10:36:40.153 に答える
1

再利用したい部分を角かっこで囲む必要があります==>それらをキャプチャします。$1次に、最初のグループ、2番目のグループの置換文字列(またはグループが9を超える場合は$ {1})でこれらの値にアクセスできます$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 に答える