¿Cómo extraer el contenido de un div específico de otra página en el mismo servidor?

Hola amigos, estoy ejecutando 2 aplicaciones en el mismo servidor y quería importar parte del contenido de la Aplicación-1 a la Aplicación-2 y, de manera similar, algo del contenido de la Aplicación-2 a la Aplicación-2.

Actualmente así es como lo estoy obteniendo:

<?php
    $app1 = file_get_contents('http://localhost/cms');

    file_put_contents('cms.html', $app1); 

    $app2 = file_get_contents('http://localhost/blog');

    file_put_contents('blog.html', $app2); 
?>

Así estoy guardando estos 2 archivos con el HTML de esas aplicaciones

Ahora digamos que tengo

a <div id="header"> in cms.html que quiero importar en <div id="header"> de Application-2's index.php file

y

a <div id="footer"> in blog.htmlque quiero en <div id="footer"> de Application-1's index.php archivo.

¿Cómo hago esto?

ACTUALIZACIÓN: Ambas aplicaciones son Joomla y WordPress.

Mi plantilla es simple sin JavaScript, así que sugiera amablemente una solución PHP hasta que, a menos que sea obligatorio cargar JavaScript, quiero que sea simple y liviano.

Tenga en cuenta también que acabo de comenzar a aprender a programar, por lo tanto, será muy difícil para mí entender un lenguaje demasiado técnico y, por lo tanto, solicito un lenguaje simple. Espero que entiendas.

Si mi enfoque es incorrecto desde el principio, no dude en sugerir un método mejor para realizar esta tarea.

Amablemente ayuda.

ACTUALIZACIÓN 2: Por favor, no, mi problema no es obtener contenido de la otra aplicación. Mi problema es obtener un fragmento del archivo HTML que se está generando.

preguntado el 08 de enero de 11 a las 18:01

4 Respuestas

Si los archivos residen en el mismo servidor local, no es necesario utilizar file_get_contents con una URL HTTP. Al hacerlo, se realizará una solicitud HTTP y eso agregará una latencia innecesaria.

A menos que desee que los archivos sean procesados ​​por sus respectivas aplicaciones, simplemente puede cargar el contenido de los archivos HTML desde su ruta de archivo, p. Ej.

$content = file_get_contents('/path/to/application1/html/file.htm');

Si esos archivos contienen PHP que necesita ser evaluado, use

include 'path/to/application1/html/file.htm';

en lugar de. Tenga en cuenta que el uso include pondrá PHP en modo HTML al principio del archivo de destino y reanudará el modo PHP nuevamente al final. Por lo tanto, debe incluir cualquier código PHP en el archivo con el correspondiente <?php etiqueta abierta.

Si necesita capturar la salida de la llamada de inclusión en una variable, envuélvala en

ob_start();
include '…'; // this can also take a URL
$content = ob_get_clean();

Esto habilitará búfer de salida.

Si necesita trabajar en el HTML dentro de los archivos, use un analizador HTML adecuado.

contestado el 23 de mayo de 17 a las 12:05

Perdón por la información incompleta. En realidad, ambas aplicaciones son Joomla y WordPress, estos DIV de los que estoy hablando contienen las posiciones del módulo / widget y deben ser procesados ​​por las aplicaciones antes de la salida. - Vikram Rao

@Vikram Todavía no estoy seguro de entender la pregunta, pero supongo que incluir o usar su enfoque actual es el único enfoque factible. Lo siento si no puedo ser más útil. - Gordon

Por el método de inclusión está dando el error Error fatal: usar $ this cuando no está en el contexto del objeto en E: \ xampp \ htdocs \ cms \ templates \ joomla \ blocks \ header.php en la línea 3 porque en la línea 3 del archivo header.php lo estamos llamando como <?php if ($this->countModules('logo or navigation')) { ?> y estas son etiquetas específicas de Joomla. - Vikram Rao

@Vikram, está bien. Eso probablemente se deba a la forma en que Joomla procesa las plantillas en ese momento. No estoy familiarizado con Joomla, pero supongo que está usando algún tipo de clase de vista que simplemente incluye su plantilla dentro de un método de representación de la instancia de vista, por ejemplo, en el contexto del objeto. Podría intentar incluir y crear una instancia de la clase View, pero dudo que esto sea tan sencillo como simplemente hacerlo de la forma en que ya lo está haciendo. Y si eso funciona y es lo suficientemente rápido, no me molestaría. Hacer que dos aplicaciones completamente separadas interactúen siempre es un desafío. - Gordon

Hmmm cierto. Pero en realidad quería extraer el contenido de <div id="header"> desde el archivo HTML que se está guardando utilizando el método anterior. Porque hay un CRON que ejecuta el código anterior a intervalos regulares y actualiza los dos archivos HTML. Mi problema no es obtener contenido de la otra aplicación. Mi problema es que solo quiero importar un fragmento <div id="header"> a partir del contenido HTML generado del archivo HTML. - Vikram Rao

Esto es lo que te sugiero:

Cree header.php y footer.php, cada uno con el contenido que quieres tener en ambos encabezados / pies de página.

Dentro de su <div id="header">, Agrega un <?php include "header.php" ?> en todos sus archivos que desea compartir el mismo encabezado. Del mismo modo, haga lo mismo con el pie de página.

A menos que realmente tenga que hacerlo, intentar analizar partes de otra página para encontrar las etiquetas adecuadas hará que lo que está intentando hacer sea innecesariamente complicado.

- Editar: dado que está trabajando con CMS, en realidad no hay archivos en su sistema para analizar. El HTML que ve en un navegador se crea en el momento en que alguien lo solicita.

Para hacer lo que estás describiendo, podría use la biblioteca cURL de php para acceder a la página, luego analice el html para extraer las etiquetas que está buscando. Sin embargo, este método será extremadamente lento, ya que básicamente requiere que el usuario cargue 2 páginas en lugar de 1.

Es posible que desee buscar en el backend de joomla / wordpress; vea cómo se almacena el pie de página en la base de datos e ingrese el código para acceder a él desde la otra aplicación.

Respondido el 08 de enero de 11 a las 22:01

Hola Sam, gracias por responder, pero no, eso no es posible porque las 2 aplicaciones son Joomla y WordPress y la página debe procesarse antes de que pueda obtener el resultado. Entonces, incluyendo meramente el header.php or footer.php no ayudará. porque estos contienen las posiciones del módulo / widget que son procesadas por la aplicación antes de la salida. - Vikram Rao

@Vikram esta es información importante que debe agregar al cuerpo de la pregunta. - Gordon

Bueno, supongo que encontré una mejor manera de hacerlo yo mismo, así que publico aquí como una respuesta por el bien de otros que buscan una solución similar.

Escriba una clase que lea entre los marcadores y obtenga ese bit.

<?Php
class className {
    private $_content;
    private $_Top;
    private $_Bottom;

    public function __construct(
        $url, $markerStartTop = null, 
        $markerEndTop = null, 
        $markerStartBottom = null, 
        $markerEndBottom = null){

            $this->_content = file_get_contents($url);
            $this->_renderTop($markerStartTop, $markerEndTop);
            $this->_renderBottom($markerStartBottom, $markerEndBottom);
        }

    public function renderTop($markerStart = null, $markerEnd = null){
        return $this->_Top;
        }

    private function _renderTop($markerStart = null, $markerEnd = null){
        $markerStart = (is_null($markerStart)) ? '<!– Start Top Block –>' : (string)$markerStart;
        $markerEnd = (is_null($markerEnd)) ? '<!– End Top Block –>' : (string)$markerEnd;

        $TopStart = stripos($this->_content, $markerStart);
        $TopEnd = stripos($this->_content, $markerEnd);

        $this->_Top = substr($this->_content, $TopStart, $TopEnd-$TopStart);
        }

    public function renderBottom(){
        return $this->_Bottom;
        }

    private function _renderBottom($markerStart = null, $markerEnd = null){ 
        $markerStart = (is_null($markerStart)) ? '<!– Start Bottom Block –>' : (string)$markerStart;
        $markerEnd = (is_null($markerEnd)) ? '<!– End Bottom Block –>' : (string)$markerEnd;

        $BottomStart = stripos($this->_content, $markerStart);
        $BottomEnd = stripos($this->_content, $markerEnd);

        $this->_Bottom = substr($this->_content, $BottomStart, $BottomEnd-$BottomStart);
        }
}
?>

Llámalo:

<?php
    $parts = new className('url/to/the/application');
    echo $parts->renderTop();
?>

Este método obtiene exactamente el fragmento del contenido que marcó entre los marcadores deseados.

Respondido el 08 de enero de 11 a las 23:01

Esto asume XHTML y PHP 5 bien formados:

  1. Obtenga el HTML deseado a través de algún método, por ejemplo, una solicitud cURL.
  2. Use SimpleXML para analizar el XML en un DOM, luego XPath para extraer los nodos deseados.
  3. Emite los nodos extraídos como texto.

Respondido el 09 de enero de 11 a las 00:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.