salto linea doble dar concatenar php regex newline

php - linea - ¿Cómo reemplazar todos los saltos de línea XHTML/HTML(<br>) con nuevas líneas?



salto de linea en php echo (4)

Estoy buscando la mejor función br2nl . Me gustaría reemplazar todas las instancias de <br> y <br /> con nuevas líneas /n . Muy parecido a la función nl2br() pero al revés.

Sé que hay varias soluciones en los comentarios manuales de PHP, pero estoy buscando comentarios de la comunidad SO sobre posibles soluciones.


De los comentarios nl2br :

<?php function br2nl($string){ $return=eregi_replace(''<br[[:space:]]*/?''. ''[[:space:]]*>'',chr(13).chr(10),$string); return $return; } ?>


Debería usar la constante PHP_EOL para tener nuevas líneas independientes de la plataforma.

En mi opinión, usar funciones que no sean de expresiones regulares siempre que sea posible hace que el código sea más legible.

$newlineTags = array( ''<br>'', ''<br/>'', ''<br />'', ); $html = str_replace($newlineTags, PHP_EOL, $html));

Soy consciente de que esta solución tiene algunos defectos, pero quería compartir mis ideas aún.


En general, diría " no utilices expresiones regex para trabajar con HTML ", pero, en este caso, probablemente iría con una expresión regular, teniendo en cuenta que las etiquetas <br> generalmente se ven así:

  • <br>
  • o <br/> , con cualquier cantidad de espacios antes del /


Supongo que algo como esto haría el truco:

$html = ''this <br>is<br/>some<br />text <br />!''; $nl = preg_replace(''#<br/s*/?>#i'', "/n", $html); echo $nl;

Par de notas:

  • comienza con <br
  • seguido de cualquier número de caracteres blancos: /s*
  • opcionalmente, a / : /?
  • y, finalmente, a >
  • y esto usando una coincidencia insensible a mayúsculas y minúsculas ( #i ), ya que <BR> sería válido en HTML

Si el documento está bien formado (o al menos bien formado-ish) puede usar la extensión DOM y xpath para buscar y reemplazar todos los elementos br por un nodo / n de texto.

$in = ''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>''; $doc = new DOMDOcument; $doc->loadhtml($in); $xpath = new DOMXPath($doc); $toBeReplaced = array(); foreach($xpath->query(''//br'') as $node) { $toBeReplaced[] = $node; } $linebreak = $doc->createTextNode("/n"); foreach($toBeReplaced as $node) { $node->parentNode->replaceChild($linebreak->cloneNode(), $node); } echo $doc->savehtml();

huellas dactilares

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head><title>...</title></head> <body>abc def<p>ghi jkl</p> </body> </html>

editar: versión más corta con una sola iteración

$in = ''<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html><head><title>...</title></head><body>abc<br />def<p>ghi<br />jkl</p></body></html>''; $doc = new DOMDOcument; $doc->loadhtml($in); $xpath = new DOMXPath($doc); $linebreak = $doc->createTextNode("/n"); foreach($xpath->query(''//br'') as $node) { $node->parentNode->removeChild($node); } echo $doc->savehtml();