¿Cómo puedo hacer eco de HTML en PHP?

122

Quiero generar HTML condicionalmente para generar una página, entonces, ¿cuál es la forma más fácil de hacer eco de fragmentos de HTML de varias líneas en PHP 4+? ¿Necesitaría usar un marco de plantilla como Smarty?

echo '<html>', "\n"; // I'm sure there's a better way!
echo '<head>', "\n";
echo '</head>', "\n";
echo '<body>', "\n";
echo '</body>', "\n";
echo '</html>', "\n";
El flash
fuente
2
\ n no funciona en html. Supongo que te referías a echo "<br>";
Weishi Zeng
Una buena práctica dice que separe su lógica de la vista (como en MVC). use el motor templetig como Twig para separar su vista de la lógica del script: twig.sensiolabs.org En lugar de implementar su marcado html en su script php, hágalo al revés. Implemente variables php en el templo de ramita. Tan pronto como entienda lo que quiero decir, verá los beneficios de este enfoque. Twig resuelve este tipo de problemas. Para un pequeño cambio de código, puede escribir su propia extensión de ramita que luego puede usar en segundos para realizar algunas tareas complicadas pero repetitivas.
DevWL

Respuestas:

269

Hay algunas formas de hacer eco de HTML en PHP.

1. Entre etiquetas PHP

<?php if(condition){ ?>
     <!-- HTML here -->
<?php } ?>

2. En un eco

if(condition){
     echo "HTML here";
}

Con los ecos, si desea usar comillas dobles en su HTML, debe usar ecos de comillas simples de la siguiente manera:

echo '<input type="text">';

O puedes escapar de ellos así:

echo "<input type=\"text\">";

3. Heredocs

4. Nowdocs (a partir de PHP 5.3.0)

Los motores de plantillas se utilizan para usar PHP en documentos que contienen principalmente HTML. De hecho, el propósito original de PHP era ser un lenguaje de plantillas. Es por eso que con PHP puede usar cosas como etiquetas cortas para hacer eco de variables (por ejemplo <?=$someVariable?>).

Hay otros motores de plantillas (como Smarty, Twig, etc.) que hacen que la sintaxis sea aún más concisa (por ejemplo {{someVariable}}).

El beneficio principal de usar un motor de plantillas es mantener el diseño ( lógica de presentación ) separado de la codificación ( lógica de negocios ). También hace que el código sea más limpio y fácil de mantener a largo plazo.

Si tiene más preguntas, no dude en dejar un comentario.

Hay más lecturas disponibles sobre estas cosas en la documentación de PHP .


NOTA: etiquetas PHP corta <?y ?>se desaniman porque son sólo está disponible si se ha activado la short_open_taginstrucción del fichero de configuración php.ini, o si PHP fue configurado con la --enable-short-tagsopción. Están disponibles, independientemente de la configuración de 5.4 en adelante .

Chris Bier
fuente
77
¿No debería el "/ * HTML aquí * /" REALMENTE ser un "<! - HTML aquí ->"? ;)
Jeremy Logan
Sí, en la primera publicación estás en lo correcto. Estaba atrapado en el código jaja. Gracias.
Chris Bier
1
Gracias, @ Chris B. me ayudó. Con los ecos, si desea utilizar comillas dobles en su HTML, debe utilizar comillas simples de esta manera: en realidad me faltaba esto.
Ayush Mishra
1
Este primer enlace en la respuesta ahora se elimina :(
mcon
En realidad, las únicas etiquetas cortas disponibles a partir de 5.4 son las etiquetas de eco cortas <?=$var?>. Las etiquetas cortas se desaconsejan como de costumbre y se deben eliminar ( <? doStuff() ?>).
igorsantos07
65

Pruébelo así ( sintaxis heredoc ):

$variable = <<<XYZ
<html>
<body>

</body>
</html>
XYZ;
echo $variable;
lfx
fuente
8
@MhdSyrwan solo caracteres aleatorios, puedes leer más aquí php.net/manual/en/…
lfx
1
¿cuidado para elaborar? No veo los corchetes PHP de apertura o cierre, pero tanto HTML como PHP, ¿eh? - el enlace funciona y lo responde mejor, pero ¿tal vez debería estar en el texto de respuesta, no en los comentarios?
Julix
@Julix, por supuesto, debe agregar etiquetas de apertura y ( depende ) de cierre de PHP. Solo quería hacer el ejemplo corto.
Fahmi
Lo tengo; de alguna manera me perdí esta era la sintaxis heredocs (es decir, todo el código es php). Me confundí, ya que era nuevo en PHP en ese momento y solía ver la sintaxis como <?php $variable = "bla"; ?> <html> <body class="<?php echo $variable ?>"> </body> </html>--- Así que pensé que faltaban un par de paréntesis y no estaba seguro de a dónde irían exactamente. Siempre es divertido cuando se responden mis comentarios un poco más antiguos, ya que era muy nuevo en todo entonces.
Julix
30

Puede usar la sintaxis alternativa sintaxis alternativa para estructuras de control y salir de PHP:

<?php if ($something): ?>
    <some /> <tags /> <etc />
    <?=$shortButControversialWayOfPrintingAVariable ?>
    <?php /* A comment not visible in the HTML, but it is a bit of a pain to write */ ?>
<?php else: ?>
    <!-- else -->
<?php endif; ?>
Tom Haigh
fuente
@Jeremy: Esta es probablemente la mejor y más directa forma de suponer que no estás buscando algo más ... ¿Estás buscando algo más?
Frank V
1
Sí, específicamente la capacidad de usar comentarios PHP entre HTML, comentarios que no se harán eco.
TheFlash el
15

Básicamente puedes poner HTML en cualquier lugar fuera de las etiquetas PHP. También es muy beneficioso hacer todo el procesamiento de datos necesario antes de mostrar cualquier información, para separar la lógica y la presentación.

La visualización de datos en sí podría estar en la parte inferior del mismo archivo PHP o podría incluir un archivo PHP separado que consista principalmente de HTML.

Prefiero este estilo compacto:

<?php
    /* do your processing here */
?>

<html>
<head>
    <title><?=$title?></title>
</head>
<body>
    <?php foreach ( $something as $item ) : ?>
        <p><?=$item?></p>
    <?php endforeach; ?>
</body>
</html>

Nota: es posible que deba usar en <?php echo $var; ?>lugar de <?=$var?>depender de su configuración de PHP.

Cabra descontento
fuente
7

Soy parcial a este estilo:

  <html>
    <head>
<%    if (X)
      {
%>      <title>Definitely X</title>
<%    }
      else
      {
%>      <title>Totally not X</title>
<%    }
%>  </head>
  </html>

Sí uso etiquetas de estilo ASP, sí. La combinación de PHP y HTML se ve muy legible a mis ojos. El truco está en obtener los marcadores <%y %>justo.

John Kugelman
fuente
¿Las etiquetas ASP son compatibles con PHP 4+?
TheFlash el
44
Sí, pero conseguir el em mientras que la última - que están siendo retirados de PHP (no estoy seguro de qué versión ... si no han ido ya)
Greg
7

Otro enfoque es colocar el HTML en un archivo separado y marcar el área para cambiar con un marcador de posición [[contenido]] en este caso. (También puede usar sprintf en lugar de str_replace).

$page = 'Hello, World!';
$content = file_get_contents('html/welcome.html');
$pagecontent = str_replace('[[content]]', $content, $page);
echo($pagecontent);

Alternativamente, puede enviar todas las cosas de PHP a la pantalla capturada en un búfer, escribir el HTML y volver a colocar la salida de PHP en la página.

Puede parecer extraño escribir el PHP, atraparlo y luego volver a escribirlo, pero eso significa que puede hacer todo tipo de cosas de formateo ( heredoc , etc.) y probar que sale correctamente sin la molestia de la página plantilla que se interpone en el camino. (El CMS Joomla lo hace de esta manera, por cierto).

Es decir:

<?php
    ob_start();
    echo('Hello, World!');
    $php_output = ob_get_contents();
    ob_end_clean();
?>
<h1>My Template page says</h1>
<?php
    echo($php_output);
?>
<hr>
Template footer
julz
fuente
2

Simplemente use la función de impresión para hacer eco del texto en el archivo PHP de la siguiente manera:

<?php

  print('
    <div class="wrap">

      <span class="textClass">TESTING</span>

    </div>
  ')
?>
Code Spy
fuente
2
$enter_string = '<textarea style="color:#FF0000;" name="message">EXAMPLE</textarea>';

echo('Echo as HTML' . htmlspecialchars((string)$enter_string));
ezequiel wernicke
fuente
1

Además de la respuesta de Chris B , si necesita usarlo de echotodos modos, aún desea mantenerlo simple y estructurado y no desea enviar el código con spam <?php stuff; ?>, puede usar la sintaxis a continuación.

Por ejemplo, desea mostrar las imágenes de una galería:

foreach($images as $image)
{
    echo
    '<li>',
        '<a href="', site_url(), 'images/', $image['name'], '">',
            '<img ',
                'class="image" ',
                'title="', $image['title'], '" ',
                'src="', site_url(), 'images/thumbs/', $image['filename'], '" ',
                'alt="', $image['description'], '"',
            '>',
        '</a>',
    '</li>';
}

Echo toma múltiples parámetros, por lo que con una buena sangría se ve bastante bien. También usar echocon parámetros es más efectivo que concatenar.

totymedli
fuente
1
echo '
<html>
<body>
</body>
</html>
';

o

echo "<html>\n<body>\n</body>\n</html>\n";
Alessandro
fuente
1

Prueba esto:

<?php
    echo <<<HTML

    Your HTML tags here

HTML;
?>
edCoder
fuente
0

No hagas eco de HTML.

Si quieres usar

<?php echo "<h1>  $title; </h1>"; ?>

deberías estar haciendo esto:

<h1><?= $title;?></h1>
Hmache
fuente
-1

Así es como lo hago:

<?php if($contition == true){ ?>
         <input type="text" value="<?php echo $value_stored_in_php_variable; ?>" />
<?php }else{ ?>
         <p>No input here </p>
<?php } ?>
Cristi bejan
fuente