Comunidad PHPeros

Otros => Los Retos PHPeros => Mensaje iniciado por: alienmaster en 22 de Septiembre de 2007, 09:12:31 am

Título: Reto de paginacion cortando el contenido
Publicado por: alienmaster en 22 de Septiembre de 2007, 09:12:31 am
Bueno, este reto es algo entretenido y sencillo (yo lo hice en 20 minutos) y sera muy util para vuestros scripts. El reto se trata de elaborar un script que si a este le enviamos una variable llamada $texto y con el siguiente cotenido:
Código: [Seleccionar]
Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!Pagine el texto, es decir que lo corte en 3 paginas segun cortemos la variable, señalando cada pagina por un [--pagina--], es decir:
Código: [Seleccionar]
pagina1[--pagina--]pagina2[--pagina--]pagina3...
Yo lo acabo de hacer, la idea no es mia, se la e escuchado a varia gente, pero nunca e visto una programacion por el estilo. Quien lo resuelva, me gustaria que indicara con comentarios lo que hace en cada parte, para hacer un mejor script y demostrar que esta programado por l mismo. Para que lo veais como es el resultado, podreis ver un ejemplo online del que yo programe, puesun reto hay que superarlo uno mismo antes de enviarselo a hacer a otros:
http://alien2006.al.funpic.de/pag.php


Salu2
Título: Re: Reto de paginacion cortando el contenido
Publicado por: CarlosRdrz en 22 de Septiembre de 2007, 09:52:30 am

<?php
$texto = "Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!";

if(!$_GET['p']) {
$pagina = 1; // Si no esta definido la variable P en la barra de direcciones, la pagina sera la numero 1
} elseif ($_GET['p'] == 2) {
$pagina = 2; // Si esta definida como 2, sera la pagina 2
} elseif($_GET['p'] == 3) {
$pagina = 3; // Si esta definida como 3, la pagina sera la numero 3
} elseif($_GET['p'] == 1) {
$pagina = 1; // Si esta definida como 1, la pagina sera la numero 1
} else {
echo "El sistema no reconoce los datos enviados por URL";
}

$paginado = explode("[--pagina--]",$texto); // Dividimos el texto por los caracteres [--pagina--], asi que queda dividido en 3 partes

echo $paginado[$pagina-1]; // Mostramos la pagina que se ha elegido
echo "<br>"; // Mostramos un salto de linea
echo "<a href='?p=1'>1</a> <a href='?p=2'>2</a> <a href='?p=3'>3</a>"; // Mostramos enlaces para pasar a otras paginas
?>

Saludos!
Título: Re: Reto de paginacion cortando el contenido
Publicado por: alienmaster en 22 de Septiembre de 2007, 10:18:25 am

<?php
$texto = "Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!";

if(!$_GET['p']) {
$pagina = 1; // Si no esta definido la variable P en la barra de direcciones, la pagina sera la numero 1
} elseif ($_GET['p'] == 2) {
$pagina = 2; // Si esta definida como 2, sera la pagina 2
} elseif($_GET['p'] == 3) {
$pagina = 3; // Si esta definida como 3, la pagina sera la numero 3
} elseif($_GET['p'] == 1) {
$pagina = 1; // Si esta definida como 1, la pagina sera la numero 1
} else {
echo "El sistema no reconoce los datos enviados por URL";
}

$paginado = explode("[--pagina--]",$texto); // Dividimos el texto por los caracteres [--pagina--], asi que queda dividido en 3 partes

echo $paginado[$pagina-1]; // Mostramos la pagina que se ha elegido
echo "<br>"; // Mostramos un salto de linea
echo "<a href='?p=1'>1</a> <a href='?p=2'>2</a> <a href='?p=3'>3</a>"; // Mostramos enlaces para pasar a otras paginas
?>

Saludos!
Esta incumpleto en lo que se refiere a mostrar las paginas, pues tienes que mostrar las apginas existentes, y en tu script sean las paginas que sean solo mostraria 3. Tambien a poder ser y para un mejor detallle no estaria mal que marcaras de alguna manera la pagina que se esta visitando en negrita o algo abajo donde aparezcan las posibels paginas.

Salu2!
Título: Re: Reto de paginacion cortando el contenido
Publicado por: CarlosRdrz en 22 de Septiembre de 2007, 10:40:30 am

<?php
$texto = "Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro

tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!";

if($_GET['p']) {
if(!is_numeric($_GET['p'])) {
echo "P debe ser un numero!";
exit;
} else {
$pagina = $_GET['p'];
}
} else {
$pagina = 1;
}

$paginado = explode("[--pagina--]",$texto); // Dividimos el texto por los caracteres [--pagina--], asi que queda dividido en 3 partes

echo $paginado[$pagina-1]; // Mostramos la pagina que se ha elegido
echo "<br>"; // Mostramos un salto de linea
$enlaces = "";
$numero = count($paginado);

for($i = 1; $i <= $numero; $i++) {
 if($pagina == $i)  {
  $enlaces .= "<a href='?p=".$i."'><strong>".$i."</strong></a> ";
 } else {
  $enlaces .= "<a href='?p=".$i."'>".$i."</a> ";
 }
}

echo $enlaces;
## Mostramos enlaces para pasar a otras paginas
?>

Aqui lo tienes,
Un saludo!
Título: Re: Reto de paginacion cortando el contenido
Publicado por: Revancha en 22 de Septiembre de 2007, 16:39:00 pm
Yo he creado una funcion. Aqui se las dejo:
<?php
function Paginacion($Texto,$KeyDivision,$Url,$Name,$NamePag)
{
$Division = explode($KeyDivision,$Texto); // Divide Texto

if (!isset($Url)) $Url = 0; // Pagina Default

echo $Division[$Url]; // Imprime contenito de la pag. X

for ($x = 0; $x < count($Division); $x++) {
if ($Url == $x)  {
$Direcciones .= "<b>".$x."</b> "; // Numero de pagina en la que uno esta
} else {
$Direcciones .= '<a href="'.$NamePag.'?'.$Name.'='.$x.'">'.$x.'</a> '; // Numero de pagina que no se esta usando
}
}

echo "<br />".$Direcciones;
}

// Modo de uso
echo Paginacion("Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!","[--pagina--]",$_GET['Page'],"Page","paginacion.php");

?>


Explicacion:
$Texto
= Contenido
$KeyDivision = Palabra para dividir el texto
$Url = Mode de usar la paginacion ($_GET['Page'] o como le coloques)
$Name = Igual que Url, pero en este caso solo el nombre no el metodo ($_GET['Page'] = No, Page = Si)
$NamePage = Nombre la pagina

Algun error o algo avisame.

Título: Re: Reto de paginacion cortando el contenido
Publicado por: alienmaster en 22 de Septiembre de 2007, 20:20:31 pm
Bueno, creo que esto ya esta solucionado jeje, un reto sencillo. Aqui dejo mi codigo...

<?
// Sistema de paginacion mediante cortado de texto en paginas.
// aLiEnMaStEr <eFnWorkZ@hotmail.com> - http://4cosas.com
$texto = "Hola, bienvenidoas a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamoes a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!";
$paginas = explode("[--pagina--]",$texto);
if(!$_GET['pagina']){
$pag = 0;// Si no obtenemos la variable pagina nos situaremos en la pagina 0
}else{
$pag = $_GET['pagina'];// Si obtenemos la variable pagina por GET la pagina sera la misma variable.
}
$num = count($paginas);
if($pag >= $num|$pag < 0|!preg_match("/$pag/i", "0123456789")){// Evitar posibles errores del usuario
exit("Error de paginacion.");
}
$i = $paginas[$pag];
echo "Tutorial, página $pag:<br>$i<br><br>Paginas:";// Mostramos el contenido de la pagina actual y las paginas disponibles
if($pag !=0){// Si existen paginas inferiores a la actual la mostramos
for($i=0;$i<$pag;$i++){
echo " <a href='".$archivo."?pagina=$i' title='Pagina $i'>$i</a>,";
}
}
echo " <b>$pag</b>";// Mostramos la pagina actual
if($pag !=$num){
for($i=($pag + 1);$i<$num;$i++){
echo ", <a href='".$archivo."?pagina=$i' title='Pagina $i'>$i</a>";
}
}
echo ".";
?>
Título: Re: Reto de paginacion cortando el contenido
Publicado por: Revancha en 22 de Septiembre de 2007, 21:42:03 pm
Hace más retos, están interesantes xd
Título: Re: Reto de paginacion cortando el contenido
Publicado por: juaxix en 22 de Marzo de 2008, 18:55:26 pm
En el framework PHP que estoy escribiendo la cosa se simplifica de la siguiente forma:
Tenemos una clase en zenphp/clases/clase_zen_paginador.php:


/**
 * clase_zen_paginador.php
 * @author Juan Belon
 * @copyright LGPL, GPL
 * @package zenphp
 * @version 0.1.1
 * @uses zenphp FrameWork
 * @link http://csl2-zenphp.forja.rediris.es
 * @link http://www.zenphp.es
 * @link https://forja.rediris.es/projects/csl2-zenphp/
 * @magic Clase que devuelve información de números de página para paginar resultados como lo hacen los buscadores [1]  _2_ ...  _3_   _4_
 */
// +----------------------------------------------------------------------
// | zenphp.es
// +----------------------------------------------------------------------
define('ZF_PAGINAS_POR_PAGINA',10);
class zen_paginador {
/**
* ¿Ha habido algún error?
*
* @var unknown_type
*/
    var $error = false;
    /**
     * Donde se guardan las posiciones de las páginas, ver documentación
     *
     * @var array
     */
    var $posiciones = array();
    /**
     * Total de registros
     *
     * @var unknown_type
     */
    var $total_pags = 0;
    /**
     * Constructor de la clase paginadora
     *
     * @param int $pag_actual
     * @param int $total_pags
     * @param int $numero_indices
     * @return zen_paginador
     */
    function zen_paginador($pag_actual, $total_pags, $numero_indices){
        $this->comprobar($pag_actual, $total_pags);
        if($this->error == true){
            echo _("P&aacute;gina incorrecta")."\r\n";
           
        }
        $this->total_pags = intval($total_pags);
        if(($pag_actual <= ($numero_indices+1)) && ($total_pags <= ($numero_indices+1))){
            for($i=1; $i<=$total_pags; $i++) {
                if($pag_actual == $i) {
                    $this->posiciones[$i] = "actual";
                } else {
                    $this->posiciones[$i] = "enlace";
                }
            }   
        } elseif(($pag_actual <= ($numero_indices+1)) && ($total_pags > ($numero_indices+1)) && ($total_pags <= ($numero_indices*2+1))) {
            for($i=1; $i<=$total_pags; $i++) {
                if($pag_actual == $i) {
                    $this->posiciones[$i] = "actual";
                } else {
                    $this->posiciones[$i] = "enlace";
                }
            }
        } elseif(($pag_actual <= ($numero_indices+1)) && ($total_pags > ($numero_indices*2+1))) {
            for($i=1; $i<=($numero_indices*2+1); $i++) {
                if($pag_actual == $i) {
                    $this->posiciones[$i] = "actual";
                } else {
                    $this->posiciones[$i] = "enlace";
                }
            }
            $this->posiciones[$total_pags] = "separadorAntes";
        } elseif(($pag_actual > ($numero_indices+1)) && ($total_pags <= ($numero_indices*2+1))) {
            for($i=1; $i<=$total_pags; $i++) {
                if($pag_actual == $i) {
                    $this->posiciones[$i] = "actual";
                } else {
                    $this->posiciones[$i] = "enlace";
                }
            }   
        } elseif(($pag_actual > ($numero_indices+1)) && ($total_pags > ($numero_indices*2+1))) {
            $usar_separadorDespues = true;
            $usar_separadorAntes = true;
           
            if($pag_actual == ($numero_indices+2)) {
                $ancho_ini = 1;
                $usar_separadorDespues = false;
            } else {
                $ancho_ini = $pag_actual-$numero_indices;
                //$usar_separadorDespues = true;
            }
           
            if($pag_actual < ($total_pags-$numero_indices)) {
                if($pag_actual == ($total_pags-($numero_indices+1))){
                    $ancho_fin = $pag_actual+($numero_indices+1);
                    $usar_separadorAntes = false;
                } else {
                    $ancho_fin = $pag_actual+$numero_indices;
                }
            } else {
                $ancho_fin = $total_pags;
                $ancho_ini = ($total_pags-($numero_indices*2));
                $usar_separadorAntes = false;
            }
           
            if($usar_separadorDespues) {
                $this->posiciones[1] = "separadorDespues";
            }
   
            for($i=$ancho_ini; $i<=$ancho_fin; $i++) {
                if($pag_actual == $i)
                {
                    $this->posiciones[$i] = "actual";
                } else
                {
                    $this->posiciones[$i] = "enlace";
                }
            }
           
            if($usar_separadorAntes) {   
                $this->posiciones[$total_pags] = "separadorAntes";
            }
        }
    }
    /**
     * Comprueba que una página esté en el conjunto
     *
     * @param int $pagina
     * @param int $total_pags
     * @return bool
     */
    function comprobar($pagina, $total_pags=-1){
    if ($total_pags==-1) $total_pags=$this->total_pags;
        if($pagina > $total_pags)
        {
            $this->error = true;
        }
       
        return $this->error;
    }
    /**
     * Devuelve el HTML para paginar resultados
     * @example $html = $paginador->html_paginado($_GET['pagina'],"index.php/listar/");
     *
     * @param int $pagina
     * @param str $enlace
     * @param bool $mostrar_info Si es true muestra el total y el número de páginas
     * @param int $resultados_por_pagina Si no se especifica se usa ZF_PAGINAS_POR_PAGINA definido en la misma clase
     * @return str
     */
    function html_paginado($pagina,$enlace,$mostrar_info=true,$resultados_por_pagina=ZF_PAGINAS_POR_PAGINA){
    $totalPaginas = ceil($this->total_pags/$resultados_por_pagina); //calcula el total de numero de paginas
    if ($mostrar_info)
    {
    $html  = _("Total p&aacute;ginas = ") . $totalPaginas . "<br />";
        $html .= _("N&uacute;mero de p&aacute;gina = ") . $pagina . "<br /><br />";
    }
    //mostrar resultados
    $division_ini = ($pagina-1)*$resultados_por_pagina;
    $division = $resultados_por_pagina;
    //la primera y ultima pagina siempre se muestran
    //necesitamos un separador entre la primera/ultima pagina asi como en medio de los numeros de pagina
    $separador = "...";
    foreach($this->posiciones as $numero_pagi=>$tipo)
    {
        //cada numero tiene un tipo de 4 disponibles
        // "actual" - numero de pagina actual;
        //  "enlace" - es el enlace a otros numeros de pagina
        //  "separadorDespues" - primer separador entre numeros de pagina (antes)
        //  "separadorAntes" - ultimo separador (despues de los numeros de pagina)
        switch($tipo)
        {
            case "actual": $html.= '&nbsp;' . $numero_pagi . '&nbsp';
                break;
               
            case "enlace": $html .= '&nbsp<a href="'.$enlace.$numero_pagi . '">' . $numero_pagi . '</a>&nbsp;';
                break;
               
            case "separadorDespues": $html .= '&nbsp<a href="'.$enlace.$numero_pagi . '">' . $numero_pagi . '</a>&nbsp;' . $separador . '&nbsp;';
                break;
               
            case "separadorAntes": $html .= '&nbsp;' . $separador . '&nbsp;<a href="'.$enlace . $numero_pagi . '">' . $numero_pagi . '</a>';
                break;
        }
    }
    return $html;
    }
   
}



y con ella trabajaremos para cargarla ,una vez cargado el sistema con

require_once('zenphp/zen.php');

entonces hacemos la carga de la clase y procesamos el contenido donde lo necesitemos, veamos un ejemplo dificil:

 =========inicio paginador.php =========
    //generatar un array
    $resultados = range(0, 710);

    $resultados_por_pagina = 20; //20 results on a pagina
    $totalPaginas = ceil(count($resultados)/$resultados_por_pagina); //calcula el total de numero de paginas
    echo "total p&aacute;ginas = " . $totalPaginas . "<br />";

    $pagina = $_GET['p']; //obtener el numero de pagina
    echo "n&uacute;mero de p&aacute;gina = " . $pagina . "<br /><br />";

    //mostrar resultados
    $division_ini = ($pagina-1)*$resultados_por_pagina;
    $division = $resultados_por_pagina;
    echo "<pre>";
    print_r(array_division($resultados, $division_ini, $division));
    echo "</pre>";
   
   
    zen___carga_clase('zen_paginador');
   
    //parametros:
    //$pagina = pagina actual
    //$totalPaginas = numero total de paginas
    //3 = numeros a mostrar a la izquierda y a la derecha del numero de pagina actual
    $pag = new zen_paginador($pagina, $totalPaginas, 3);

    //la primera y ultima pagina siempre se muestran
    //necesitamos un separador entre la primera/ultima pagina asi como en medio de los numeros de pagina
    $separador = "...";
    foreach($pag->posiciones as $numero_pagi=>$tipo)
    {
        //cada numero tiene un tipo de 4 disponibles
        //  "actual" - numero de pagina actual;
        //  "enlace" - es el enlace a otros numeros de pagina
        //  "separadorDespues" - primer separador entre numeros de pagina (antes)
        //  "separadorAntes" - ultimo separador (despues de los numeros de pagina)
        switch($tipo)
        {
            case "actual": echo '&nbsp;' . $numero_pagi . '&nbsp';
                break;
               
            case "enlace": echo '&nbsp<a href="index.php?p=' . $numero_pagi . '">' . $numero_pagi . '</a>&nbsp;';
                break;
               
            case "separadorDespues": echo '&nbsp<a href="index.php?p=' . $numero_pagi . '">' . $numero_pagi . '</a>&nbsp;' . $separador . '&nbsp;';
                break;
               
            case "separadorAntes": echo '&nbsp;' . $separador . '&nbsp;<a href="index.php?p=' . $numero_pagi . '">' . $numero_pagi . '</a>';
                break;
        }
    }

Veamos ahora un ejemplo fácil:

zen___carga_clase('zen_paginador');
$pag = intval($datos[0]);
//$bd es una instancia de la clase zen_basedatos ($bd = new zen_basedatos(...) )
$total = abs(($bd->seleccion_unica("count(idp) from productos"))/ZF_PAGINAS_POR_PAGINA);
if ($total==0) $total = 1;
$p = new zen_paginador($pag, $total,4);
$r['paginacion'] = $p->html_paginado($pag,"index.php/index/",true,ZF_PAGINAS_POR_PAGINA);
$limite = (($pag*ZF_PAGINAS_POR_PAGINA)-1);
if ($limite<0) $limite=0;
//Ahora sólo queda usar una clase de plantillas para mostrar el resultado
//$productos es un zen_modelo_datos ($productos = new zen_modelo_datos("id,nombre...","tabla_productos"))
$productos->condiciones_where .= " limit ".$limite.",".ZF_PAGINAS_POR_PAGINA;
echo $productos->html->listado( //->html es un zen_html_modelo_datos que se crea automáticamente
 "productos/lista_productos.html","indice.html","lista_productos",$r //los HTML son plantillas para mostrar los productos
);
Título: Re: Reto de paginacion cortando el contenido
Publicado por: CarlosRdrz en 22 de Marzo de 2008, 21:04:10 pm
En el framework PHP que estoy escribiendo la cosa se simplifica de la siguiente forma:
[ ... ]

No es por nada juaxix, pero me parece mucho mas complicado lo que tu propones que las soluciones que proponen los demas, por estas razones:

- Necesitas aprender la clase que manejas casi de memoria.
- Utilizas muchas funciones que hacen el codigo mucho mas complejo de lo que en realidad es.
- Cualquier codigo de los que estan encima de tu mensaje es mas organizado, mas sencillo de leer, mas sencillo de modificar... en fin, mas sencillo en general. Y ademas, no necesita aprender las funciones de una clase auxiliar para realizar la tarea.

En definitiva, me parece que usar algo como lo que propones para realizar algo asi, es complicarse demasiado sin necesidad.

Saludos!
Título: Re: Reto de paginacion cortando el contenido
Publicado por: kael en 05 de Febrero de 2009, 04:00:44 am
algo mas sencillo XD

<?php
$texto = 'Yo lo acabo de hacer, la idea no es mia,
se la e escuchado a varia gente, pero nunca e visto
una programacion por el estilo.  Quien lo resuelva,[divide]
me gustaria queindicara con comentarios lo que hace
en cada parte, para hacer un mejor script y demostrar[divide]
que esta programado por l mismo.  Para que lo veais como
es el resultado, podreis ver un ejemplo online [divide]
del que yo programe, puesun reto hay que superarlo
 uno mismo antes de enviarselo a hacer a otros';

$array = explode('[divide]',$texto);

$total = count($array)-1;

if(isset($_GET['pag'])){
$next = $_GET['pag'];
$a = $next+1;
    if($total == $next){
    echo $array[$next];
    echo "<br /><a href=\"divide. php\">Inicio<a herf</a> [$next][$total]";
    }else{
    echo $array[$next];
    echo "<br /><a href=\"divide. php?pag=$a\">Siguiente<a herf</a> [$next][$total]";
    }
}else{

echo $array[0];
echo "<br /><a href=\"divide. php?pag=1\">Siguiente<a herf</a> [1][$total]";
}
?>
Título: Re:Reto de paginacion cortando el contenido
Publicado por: IgnacioViglo en 29 de Abril de 2012, 14:22:41 pm
Código: [Seleccionar]
<?php
$text 
= &#39;Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!&#39;;
if(strpos($text, &#39;[--pagina--]&#39;) === false) {
  
echo $text;
} else {
  
$pag = array();
  
$xp explode(&#39;[--pagina--]&#39;, $text);
  
foreach($xp as $val) {
    if(empty(
$val)) { continue; }
    
$pag[] = $val;
  }
  
$p $_GET[&#39;p&#39;] > 0 && ctype_digit($_GET[&#39;p&#39;]) && $_GET[&#39;p&#39;] <= count($pag) ? $_GET[&#39;p&#39;]-1 : 0;
  
echo $pag[$p];
  for(
$i=1;$i<=count($pag);$i++) {
    echo &
#39;<a href="?p=&#39;.$i.&#39;">&#39;.$i.&#39;</a> &#39;;
  
}
}

Pruebalo, funciona
Título: Re:Reto de paginacion cortando el contenido
Publicado por: ouch01 en 02 de Mayo de 2012, 00:35:32 am
Código: [Seleccionar]
<?php
error_reporting
(0); // Para que no salga lo de undefined index, obviamente.
$text = &#39;Hola, bienvenidos a nuestro tutorial. En el aprenderemos blablabla.... Pasemos a la siguiente pagina.[--pagina--]Seguimos con nuestro tutorial.... pasamos a la siguiente y ultima pagina...[--pagina--]Esta es la ultima pagina, aki se acaba el tutorial! saludos!!&#39;;
$ex explode(&#39;[--pagina--]&#39;, $text);
$pages count($ex);
$page = (ctype_digit($_GET[&#39;page&#39;]) && $_GET[&#39;page&#39;] > 0 && $_GET[&#39;page&#39;] <= $pages ? $_GET[&#39;page&#39;] : 1);
?>

<style>
body{ margin: 10px auto; width: 400px; }
h4, .pag{ text-align: center; }
.here{ background: #555; color: #fff; padding: 1px 3px; }
</style>
<body>
    <h4>P&aacute;gina: <?=$page?></h4>
    <p style=""><?=$ex[$page-1]?></p>
    <div class="pag">
    P&aacute;ginas:
    <?for($i=1;$i<=$pages;$i++){
        echo '<a'.($page == $i ? ' class="here"' : '').' href="?page='.$i.'">'.$i.'</a> ';
    }?>
    </div>
</body>

Y listo.