2012-09-21 61 views
1

的preg_replace我有這個字符串轉換字符串與PHP

$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

+0

您需要提供關於可能的輸入格式更明確的信息,以及究竟是如何的投入效果的輸出。它會一直是'1'和'7',還是它可能是不同的數字(或不同的數字長度,即類似'23.456')?是基於這些值的輸出,如果是這樣的話,當'7'小於10時,'7'應該是前導'0'的填充? – freefaller

+0

數字可以從1到99,所以它可以是1.1到99.99。填充會很好,但不是必須的。 –

回答

3

您需要使用preg_replace_callback如果需要墊0如果數量少於10

$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); 
+0

+1填充0 – stema

+0

謝謝!你的正則表達式肯定比我的更優雅,結果是那些預期的唯一的事情就是它也會匹配_1999.12_這些我不想要的東西。我試着用\ d {1,2},但我還是會回到_19S99E12_ –

+0

使用單詞邊界'\ B'你應該能夠做到這一點。檢查我的答案。它經過測試和工作。 –

1

我相信這會做你希望它是什麼......

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

換句話說...

  • \#? - 可與#
  • ([0-9]+)啓動 - 捕獲至少一個數字
  • [._-] - 尋找一個._-
  • ([0-9]+) - 捕獲至少一個數字

然後你就可以用這個來代替......

S$1E$2 

這將拿出S然後第一個捕獲組,然後E然後第二個捕獲組

1

您需要將括號放在您w螞蟻重用==>捕獲它們。然後,您可以使用$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); 
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調用。