Tengo este volcado de texto sin formato. Lo subí a mi sitio tal como está.
➜ Desktop ping 198.54.120.122 PING 198.54.120.122 (198.54.120.122): 56 data bytes 64 bytes from 198.54.120.122: icmp_seq=0 ttl=35 time=85.655 ms 64 bytes from 198.54.120.122: icmp_seq=1 ttl=35 time=84.976 ms 64 bytes from 198.54.120.122: icmp_seq=2 ttl=35 time=85.856 ms 64 bytes from 198.54.120.122: icmp_seq=3 ttl=35 time=85.103 ms ^C --- 198.54.120.122 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 84.976/85.397/85.856/0.368 msLo consulto de nuevo. Tengo esto.
Lo dd () para probarlo, lo que significa que en este punto, aún no perdí mis nuevas líneas.
He intentado
str_replace('\r\n','<br>',$paste->raw); y esperando ver renderizado mejor
public function raw($uuid) { $paste = Paste::where('uuid', base64_decode($uuid))->first(); return str_replace('\r\n','<br>',$paste->raw); }Se renderiza así sin saltos de línea.
PING 198.54.120.235 (198.54.120.235): 56 data bytes 64 bytes from 198.54.120.235: icmp_seq=0 ttl=35 time=85.655 ms 64 bytes from 198.54.120.235: icmp_seq=1 ttl=35 time=84.976 ms 64 bytes from 198.54.120.235: icmp_seq=2 ttl=35 time=85.856 ms 64 bytes from 198.54.120.235: icmp_seq=3 ttl=35 time=85.103 ms ^C --- 198.54.120.235 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 84.976/85.397/85.856/0.368 msIncluso pueden verlo en vivo: aquí
¿Cómo se lograría eso? ¿Debo usar el front-end para diseñar esto?
Imagínese, ve un archivo sin formato en GitHub o gist, estoy tratando de crear una versión mini de eso, la capacidad de mostrar lo que cargué y compartirlo rápidamente con otros a través de un enlace.
El enlace sugerido arriba, no responde a lo que estoy buscando.
Para mantener los saltos de línea (\n, \r\n) en html, puede usar la función php nl2br .
Su función en bruto sería algo como esto
public function raw($uuid) { $paste = Paste::where('uuid', base64_decode($uuid))->first(); return nl2br($paste->raw); }O podría usar la etiqueta <pre> para mantener el formato original.
O podría servir el archivo como texto sin formato utilizando la función de encabezado .
Agregue esto a su código antes de cualquier salida, en un controlador, por ejemplo:
header('Content-Type: text/plain');Una cosa a tener en cuenta es que si está utilizando algún marco, probablemente tendrá algún servicio de ayuda para agregar encabezados. Pero agregar este código arriba debería funcionar de cualquier manera. Y dado que está sirviendo archivos de texto sin formato, ninguna etiqueta html funcionará.
Adaptándonos a tu código:
class OutputController { public function output() { header('Content-Type: text/plain'); echo Paste::where('uuid', base64_decode($uuid))->first(); } }Intente usar la constante PHP_EOL predefinida en lugar de \r\n ( https://www.php.net/manual/en/reserved.constants.php#constant.php-eol )
return str_replace(PHP_EOL, '<br>', $paste->raw);Si desea hacer lo mismo con los espacios en blanco, puede usar los códigos html incorporados para los espacios en blanco, por ejemplo:
str_replace(' ', ' ', $string); str_replace('\t', '    ', $string);Así que todos juntos:
return str_replace('\t', '    ', str_replace(' ', ' ', str_replace(PHP_EOL, '<br>', $paste->raw))); O hay otra forma, usando la etiqueta html <pre> y <code> . Esta etiqueta hace posible que el texto se muestre exactamente como está escrito en el código fuente HTML.
return '<pre>'.str_replace('>', '>', str_replace('<', '<', $paste->raw)).'</pre>';