2010-07-27 10 views
1

更換領先的空間,我想 相同數量的發生,即與 具有相同的次數使用PHP的正則表達式

位解釋性更換前導空格:

如果一個領先的空間存在於輸入那麼它應該有一個 

取代如果在輸入中存在兩個前導空格,那麼它應該與替代兩個 

如果n領先的空間是存在的輸入,那麼它應該隨着時代確切的n個與 

Ex.1: 
My name is XYZ 
output: 
 My name is XYZ 

Ex.2 : 
    My name is XYZ 
output: 
  My name is XYZ 

我想只更換前導空格,使用PHP正則表達式替換。

您的建議,歡迎。

感謝

回答

4
$len_before = strlen($str); 
$str = ltrim($str, ' '); 
$len_after = strlen($str); 
$str = str_repeat(' ', $len_before - $len_after) . $str; 

使用preg_replace還有

$str = preg_replace('/^(+)/e', 'str_repeat(" ", strlen("$1"))', $str); 

但要注意,它使用了/e標誌。

查看http://www.ideone.com/VWNKZ的結果。

+0

那不是正則表達式。 – 2010-07-27 11:00:43

+0

這不是正則表達式,但它是最好的方式,並且不那麼重! +1 – CuSS 2010-07-27 11:01:26

+0

不要忘記* m *標誌使'^'匹配行的開頭。 – Gumbo 2010-07-27 11:08:15

0

用途:

preg_replace('/^ +/m',' ',$str); 

You can test it here

+0

+1簡單客觀的答案 – CuSS 2010-07-27 11:12:41

+3

目標是用' '替換*中的每一個前導空格。你用*一個*' '代替*全部*。 – 2010-07-27 11:20:20

+0

@alan你是對的。我的壞...我討厭斜線分隔符,順便說一句,爲什麼我使用'#' .. – 2010-07-27 11:29:38

6
preg_replace('/\G /', ' ', $str); 

\G在最後一場比賽結束的位置,或字符串的開頭相匹配,如果沒有以前的匹配。

編輯:實際上,在PHP中它匹配下一個匹配應該開始。這不一定與前一場比賽結束時相同。

+0

+1簡單和客觀的答案 – CuSS 2010-07-27 11:12:57

+0

@All:謝謝你的回答。 @Alan:我遵循你的方法。 我只是想知道更好的方法來跟隨哪一個是最佳的,高效的國旗'G','米'和'e',這樣我就會有實際的理由使用提到的標誌 – pravin 2010-07-27 11:18:40

+0

那麼,'米'允許'^'在行的開頭和字符串的開頭匹配,所以在這種情況下它不相關。 'e'使替換被視爲代碼而不是靜態字符串。這確實會非常昂貴,但實際上代碼通常很短而且很快。即使如此,'\ G'通常是最有效的選擇。 – 2010-07-27 11:43:01

0

使用PREG_OFFSET_CAPTURE標誌設置的preg_match,偏移量是「空格」的長度。然後使用帶偏移量的str_repeat。

相關問題