2009-10-31 11 views
6

Szukam utworzyć funkcję php, które można przyciąć każdej linii w długim ciągu.php, jak przyciąć każdą linię w heredoc (długi ciąg)

np

<?php 
$txt = <<< HD 
    This is text. 
      This is text. 
    This is text. 
HD; 

echo trimHereDoc($txt); 

wyjściowa:

This is text. 
This is text. 
This is text. 

Tak, wiem o funkcji przycinania(). Tylko nie wiesz, jak go używać na długich łańcuchach, takich jak heredoc.

+0

dzięki dla wszystkich rozwiązań. Muszę się nauczyć bardziej regularnej ekspresji. – Yada

Odpowiedz

23
function trimHereDoc($t) 
{ 
return implode("\n", array_map('trim', explode("\n", $t))); 
} 
+1

+1, ponieważ rozwiązanie jest bardziej ogólne. (ale nie lubię tak zwartych linii). – erenon

+0

Należy pamiętać, że spowoduje to również usunięcie znaków powrotu (\ r), które mogą być sparowane z nowymi wierszami (\ n). Plik źródłowy może być napisany z końcówkami linii DOS lub Apple, ale wynikowe przycięte linie będą miały końcówki linii Unix. Możesz ustawić końcówki linii, które ostatecznie chcesz w pierwszym parametrze instrukcji explode(). – Jason

+1

A jeśli próbujesz przyciąć nowe linie z ciągu, po prostu pomiń argument "\ n", w funkcji implodu: return implode (array_map ('trim', explode ("\ n", $ t))); – dval

5

Proste rozwiązanie

<?php 
$txtArray = explode("\n", $txt); 
$txtArray = array_map('trim', $txtArray); 
$txt = implode("\n", $txtArray); 
+1

+1, ponieważ mieliśmy ten sam pomysł, – gpilotino

9
function trimHereDoc($txt) 
{ 
    return preg_replace('/^\s+|\s+$/m', '', $txt); 
} 

^\s+ mecze spacje na początku linii i \s+$ mecze spacje na końcu linii. Flaga m mówi, że ma zamiar zastąpić wiele linii, aby ^ i $ pasowały do ​​dowolnej linii ciągu wieloliniowego.

+0

nice RE. trzeba zachować fragmenty tego. – Yada

+1

Ta funkcja jest rzeczywiście niepoprawna, ponieważ usunie puste linie również w sposób chaotyczny. Prawidłowym sposobem jest użycie "/^[\ t \ f] + | [\ t \ f] + $/m" dla wzorca. – WASD42

2
function trimHereDoc($txt) 
{ 
    return preg_replace('/^\h+|\h+$/m', '', $txt); 
} 

Podczas \s+ usuwa pustych linii, utrzymuje \h+ Każde puste linie

Powiązane problemy