2010-09-13 19 views
43
<textarea> put returns between paragraphs 
for linebreak add 2 spaces at end 
indent code by 4 spaces 
quote by placing > at start of line 
</textarea> 

$text = value from this textarea; 

Cómo:cada línea del área de texto

1) Obtener cada línea de esta área de texto ($text) y el trabajo con ellos usando foreach()?

2) Agregue <br /> al final de cada línea, excepto la última?

3) Tira cada línea a una matriz.

Importante - text inside textarea puede ser de varios idiomas.


han tratado de usar:

$text = str_replace('\n', '<br />', $text); 

Pero no funciona.


Thanks.

+0

posible duplicado de [Cómo para eliminar saltos de línea (sin caracteres) de la cadena?] (http://stackoverflow.com/questions/10757671/how-to-remove-line-breaks-no-characters-from-the-string) – kenorb

Respuesta

90

Usted tendrá que buscar en la función nl2br() junto con el trim().

El nl2br() insertará <br /> antes de que el carácter de nueva línea (\n) y el trim() se eliminarán todos los caracteres que termina \n o espacios en blanco.

$text = trim($_POST['textareaname']); // remove the last \n or whitespace character 
$text = nl2br($text); // insert <br /> before \n 

Eso debería hacer lo que quiera.

ACTUALIZACIÓN

La razón el siguiente código no funcionará es porque para que \n ser reconocido, tiene que estar dentro de comillas dobles desde comillas dobles analizar los datos dentro de ellos, en tanto que las comillas simples toma literalmente, IE "\n"

$text = str_replace('\n', '<br />', $text); 

Para solucionarlo, sería:

$text = str_replace("\n", '<br />', $text); 

Pero aún es mejor usar la función integrada nl2br(), PHP proporciona.

EDITAR

Lo sentimos, pensé que la primera pregunta era por lo que podría añadir los saltos de línea en, de hecho esto va a cambiar la respuesta un poco, como anyType de explode() eliminará los saltos de línea, pero aquí es:

$text = trim($_POST['textareaname']); 
$textAr = explode("\n", $text); 
$textAr = array_filter($textAr, 'trim'); // remove any extra \r characters left behind 

foreach ($textAr as $line) { 
    // processing here. 
} 

Si lo haces de esta manera, tendrá que añadir el <br /> en el extremo de la línea antes de que el procesamiento se realiza por su cuenta, ya que la función explode() eliminará los \n caracteres.

Agregó array_filter() a trim() de \r caracteres adicionales que pueden haber estado persistiendo.

+0

¿qué hay de la primera pregunta? – James

+0

El código anterior supone que está tomando los datos del área de texto usando un formulario que configura. Si tiene los datos HTML y desea analizarlos, consulte la respuesta de shamittomar. –

+0

¿por qué comillas dobles, cuál es la magia? – James

3

Para una <br> en cada línea, utilice

<textarea wrap="physical"></textarea> 

Usted recibirá \n s en el valor del área de texto. A continuación, utilice la función nl2br() para crear <br> s, o puede explotar() para <br> o \n.

Esperanza esto ayuda

+0

gracias por esto, es nuevo para mi – James

2
$array = explode("\n", $text); 
for($i=0; $i < count($array); $i++) 
{ 
    echo $line; 
    if($i < count($array)-1) 
    { 
     echo '<br />'; 
    } 
} 
4

Use PHP DOM para analizar y agregar <br/> en él. De esta manera:

$html = '<textarea> put returns between paragraphs 
for linebreak add 2 spaces at end 
indent code by 4 spaces 
quote by placing > at start of line 
</textarea>'; 

//parsing begins here: 
$doc = new DOMDocument(); 
@$doc->loadHTML($html); 
$nodes = $doc->getElementsByTagName('textarea'); 

//get text and add <br/> then remove last <br/> 
$lines = $nodes->item(0)->nodeValue; 

//split it by newlines 
$lines = explode("\n", $lines); 

//add <br/> at end of each line 
foreach($lines as $line) 
    $output .= $line . "<br/>"; 

//remove last <br/> 
$output = rtrim($output, "<br/>"); 

//display it 
var_dump($output); 

Esto da salida:

string ' put returns between paragraphs 
<br/>for linebreak add 2 spaces at end 
<br/>indent code by 4 spaces 
<br/>quote by placing > at start of line 
' (length=141) 
+0

+1 ya que puede querer analizar HTML, y si es así, esta es una mejor manera de hacerlo. Pero no estoy seguro si esas son sus intenciones. –

+0

gracias hombre, buena solución para analizar. – James

+0

Estoy analizando mi propio área de texto desde $ _POST – James

2
$content = $_POST['content_name']; 
$lines = explode("\n", $content); 

foreach($lines as $index => $line) 
{ 
    $lines[$index] = $line . '<br/>'; 
} 

// $lines contains your lines 
+0

gracias Robert, ¿puedes explicar esta parte del código "$ index => $ line"? – James

+1

foreach ($ lines as $ index => $ line) == "para cada elemento de $ lines, iterar con $ index que contiene la clave/índice y $ line que contiene el valor" http://fr.php.net/manual /es/control-structures.foreach.php ... (En realidad, mi primer nombre es Vincent ^^) –

+0

lo siento Vincent, gracias por el comentario. – James

32

usted podría utilizar PHP constante:

$array = explode(PHP_EOL, $text); 

notas adicionales:
1. Para mí, este es el más fácil y la manera más segura porque es multiplataforma compatible (Windows/Linux, etc.)
2. Es mejor usar PHP CONSTANTE siempre que pueda para una ejecución más rápida

+0

¡Simple y directo! Gracias – wiLLiamcastrO

+0

es realmente la manera simple .. ¡GRAN –

3

que funciona para mí:

if (isset($_POST['MyTextAreaName'])){ 
    $array=explode("\r\n", $_POST['MyTextAreaName']); 

ahora, mi $ array tendrá todas las líneas que necesito

for ($i = 0; $i <= count($array); $i++) 
    { 
     echo (trim($array[$i]) . "<br/>"); 
    } 

(asegúrese de cerrar el bloque if con otra llave de cierre)

} 
+0

perfecto! gracias –

8

Vieja banda de rodadura ...? Bueno, alguien puede tropezar con esto ...

Por favor, echa un vistazo a http://telamenta.com/techarticle/php-explode-newlines-and-you

En lugar de utilizar:

$values = explode("\n", $value_string); 

Usar un método más seguro como:

$values = preg_split('/[\n\r]+/', $value_string); 
+0

Buen punto. [Shah Erhan] (http://stackoverflow.com/a/7870846/4012426) sugirió usar 'PHP_EOL', pero no sé si los caracteres de final de línea enviados por los navegadores siempre equivalen al final de caracteres de línea en el servidor. Tu enlace está horriblemente roto, por cierto. –

Cuestiones relacionadas