Sunteți pe pagina 1din 24

Filtrar datos en php con la funcin filter_var

A la hora de deja que un usuario introduzca datos en nuestra aplicacin por medio de algn formulario, debemos de tener muy en cuenta el filtrado de esos datos para evitar que nos puedan meter algn cdigo malicioso que pueda afectar a nuestra aplicacin. Si filtramos los datos, podremos evitar tipos de ataques como es el SQL Inyection o el XSS. Podramos pensar que hacer la validacin a nivel del cliente podra ser suficiente, pero hay herramientas que permiten saltarse esa verificacin y de esa forma poner en peligro nuestra aplicacin. Hoy vamos a ver una forma de verificar los datos por medio de la funcin filter_var que nos proporciona PHP. La funcin filter_var nos permite filtrar una variable segn el filtro especificado en sus parmetros. Los parmetros que puede recibir esta funcin son:

$var: Variable que se quiere filtrar. $filter: Filtro que deseamos aplicar. Ser una constante numrica. $options: Conjunto de opciones que modificarn el funcionamiento del filtro. Ser una constante numrica o un array.

A continuacin indicamos un listado de filtros de validacin:

FILTER_VALIDATE_BOOLEAN: Valida la variable como un booleano. FILTER_VALIDATE_EMAIL: Valida la variable como una direccin de correo electrnico correcta. FILTER_VALIDATE_FLOAT: Valida que la variable sea del tipo float. FILTER_VALIDATE_INT: Valida la variable como un nmero entero. FILTER_VALIDATE_IP: Valida la variable como una direccin IP. FILTER_VALIDATE_REGEXP: Valida la variable contra una expresin regular enviada en la variable de opciones. FILTER_VALIDATE_URL: Valida el valor coma una URL de acuerdo con la RFC 2396.

A continuacin, os mostramos un listado de filtros para sanear:

FILTER_SANITIZE_EMAIL: Elimina todos los caracteres execpto letras, nmeros y !#$%&*+-/=?^_`{|}~@.[]. FILTER_SANITIZE_ENCODED: Codifica la cadena como una URL vlida. FILTER_SANITIZE_MAGIC_QUOTES: Aplica la funcin addslashes. FILTER_SANITIZE_NUMBER_FLOAT: Elimina todos los caracteres excepto nmeros, +- y opcionalmente ,.eE. FILTER_SANITIZE_NUMBER_INT: Elimina todos los caracteres excepto nmeros y los signos + -. FILTER_SANITIZE_SPECIAL_CHARS: Escapa caracteres HTML y caracteres con ASCII menor a 32. FILTER_SANITIZE_STRING: Elimina etiquetas, opcionalmente elimina o codifica caracteres especiales. FILTER_SANITIZE_STRIPPED: Alias del filtro anterior. FILTER_SANITIZE_URL: Elimina todos los caracteres excepto nmeros, letras y $_.+!*(),{}|^~[]`#%;/?:@&=.

Filtros para el saneamiento de textos:

FILTER_FLAG_NO_ENCODE_QUOTES: No codificar las comillas simples ni dobles. FILTER_FLAG_STRIP_LOW: Elimina caracteres cuyo varlor ASCII sea menor a 32. FILTER_FLAG_STRIP_HIGH: Elimina caracteres cuyo valor ASCII sea mayor a 127.

FILTER_FLAG_ENCODE_LOW: Codifica caracteres cuyo valor ASCII sea mennor a 32. FILTER_FLAG_ENCODE_HIGH: Codifica caracteres cuyo valor ASCII sea mayor a 127. FILTER_FLAG_ENCODE_AMP: Codifica ampersands (&).

Vamos a proceder a ver algunos ejemplos que nos puedan servir para ver su funcionamiento. En el primero veremos como validar un nmero entero.

$var = echo filter_var($var, FILTER_VALIDATE_INT);

123;

En este caso, la funcin devuelve el nmero si es correcto, o el valor false, si no es entero. Tambin podemos indicar que el valor debe de estar dentro de un rango. El cdigo sera el siguiente:

$options

array('min_range'=>10, FILTER_VALIDATE_INT, echo echo

'max_range' $options) 'Valor 'Valor

=>

20));

if(filter_var($var, }else{

=== false){ incorrecto'; correcto';

}
En este otro ejemplo, limpiaremos nuestra cadena de todos los elementos que no tienen cabida en nuestro campo. $var echo filter_var($var, = 'uno23'; FILTER_SANITIZE_NUMBER_INT);

En este caso, queremos sanear para dejar un entero. La salida sera el valor 23, la cadena uno desaparecera. Ahora veremos un ejemplo de como sanear una cadena que incluye caracteres html, pero dejando sin codificar las comillas dobles.

$text

'<p>"Hola

mundo!"</p>'; FILTER_SANITIZE_STRING,

echo filter_var($text, FILTER_FLAG_NO_ENCODE_QUOTES); //Resultado: "Hola mundo!"

Como podis ver, esta funcin nos puede ser de mucha ayuda a la hora de limpiar los campos y as evitarnos posibles problemas.

La extensin Filter
Esta extensin de PHP nos expone un conjunto de funciones que nos permitirn la validacin y saneamiento de datos de una forma sencilla. La funcion filter_var nos permite filtrar una variable segn el filtro especificado. El orden de los parmetros es el siguiente:

$var: Variable que se quiere filtrar $filter: Filtro que se desea aplicar. Ser una constante numrica $options: Conjunto de opciones que modificarn el funcionamiento del filtro. Ser una constante numrica o un array

A continuacin un listado de filtros de validacin posibles: FILTER_VALIDATE_BOOLEAN Valida la variable como un booleano. FILTER_VALIDATE_EMAIL Valida la variable como una direccin de correo electrnico correcta. FILTER_VALIDATE_FLOAT Valida que la variable sea del tipo float. FILTER_VALIDATE_INT Valida la variable como un nmero entero. FILTER_VALIDATE_IP Valida la variable como una direccin IP.

FILTER_VALIDATE_REGEXP Valida la variable contra una expresin regular enviada en la variable de opciones. FILTER_VALIDATE_URL Valida el valor coma una URL de acuerdo con la RFC 2396. A continuacin el listado de filtros para sanear: FILTER_SANITIZE_EMAIL Elimina todos los caracteres execpto letras, nmeros y !#$%&*+-/=?^_`{|}~@.[]. FILTER_SANITIZE_ENCODED Codifica la cadena como una URL vlida. FILTER_SANITIZE_MAGIC_QUOTES Aplica la funcin addslashes. FILTER_SANITIZE_NUMBER_FLOAT Elimina todos los caracteres excepto nmeros, +- y opcionalmente ,.eE. FILTER_SANITIZE_NUMBER_INT Elimina todos los caracteres excepto nmeros y los signos + -. FILTER_SANITIZE_SPECIAL_CHARS Escapa caracteres HTML y caracteres con ASCII menor a 32. FILTER_SANITIZE_STRING Elimina etiquetas, opcionalmente elimina o codifica caracteres especiales. FILTER_SANITIZE_STRIPPED Alias del filtro anterior. FILTER_SANITIZE_URL Elimina todos los caracteres excepto nmeros, letras y $_.+!*(),{}|\\^~[]`<>#%;/?:@&=.

Validar y sanear un nmero entero


Vamos a ver un sencillo ejemplo de validacin de un nmero entero.
view plaincopy to clipboardprint?

1. <?php 2. $var = 123; 3. echo filter_var($var, FILTER_VALIDATE_INT);

La funcin nos devolver el entero en caso de que la validacin sea correcta, en caso contrario, nos devolver FALSE.
view plaincopy to clipboardprint?

1. <?php

2. 3. 4. 5. 6. 7.

$var = 'dos'; if(filter_var($var, FILTER_VALIDATE_INT) === false){ echo 'Valor incorrecto'; }else{ echo 'Valor correcto'; }

A la hora de validar un entero, podemos jugar con las opciones para hacer ajustar el comportamiento de la funcin a nuestras necesidades. En el siguiente ejemplo se muestra como validar un entero que est dentro de un rango especfico:
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7.

$options = array('min_range'=>10, 'max_range' => 20)); if(filter_var($var, FILTER_VALIDATE_INT, $options) === false){ echo 'Valor incorrecto'; }else{ echo 'Valor correcto'; }

Ahora vamos a ver como sanear un entero, para los que no entiendan, sanear significa limpiar, es decir, quitamos todo lo que no tiene cabida en nuestro campo.
view plaincopy to clipboardprint?

1. <?php 2. $var = 'uno23'; 3. 4. echo filter_var($var, FILTER_SANITIZE_NUMBER_INT);

El cdigo anterior nos devuelve 23 debido a que elimina todos los caracteres no numricos de la cadena.

Validar y sanear un nmero float


La validacin simple de un float es practicamente igual que la de un entero:
view plaincopy to clipboardprint?

1. <php 2. $var = 1.3; 3. 4. echo filter_var($var, FILTER_VALIDATE_FLOAT);

Sin embargo, con este filtro tenemos una opcion interesante que nos permite especificar cual es el caracter que separa los decimales.
view plaincopy to clipboardprint?

1. 2. 3. 4.

<php $var = '1,3'; $options = array('options'=>array('decimal'=>',')); echo filter_var($var, FILTER_VALIDATE_FLOAT, $options);

Saneamiento de textos

La limpieza de los textos es algo muy importante y por ello tenemos varios flags que modifican el comporamiento del filtro FILTER_SANITIZE_STRING: FILTER_FLAG_NO_ENCODE_QUOTES No codificar las comillas simples ni dobles. FILTER_FLAG_STRIP_LOW Elimina caracteres cuyo varlor ASCII sea menor a 32. FILTER_FLAG_STRIP_HIGH Elimina caracteres cuyo valor ASCII sea mayor a 127. FILTER_FLAG_ENCODE_LOW Codifica caracteres cuyo valor ASCII sea mennor a 32. FILTER_FLAG_ENCODE_HIGH Codifica caracteres cuyo valor ASCII sea mayor a 127. FILTER_FLAG_ENCODE_AMP Codifica ampersands (&). A continuacin algunos ejemplos:
view plaincopy to clipboardprint?

1. 2. 3. 4.

<php $text = '<p>"Hola mundo!"</p>'; echo filter_var($text, FILTER_SANITIZE_STRING); //Resultado: &#34;Hola mundo!&#34;

view plaincopy to clipboardprint?

1. <php 2. $text = '<p>"Hola mundo!"</p>'; 3. echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES); 4. //Resultado: "Hola mundo!"
view plaincopy to clipboardprint?

1. <php 2. $text = '"Ontuts & Cokidoo"'; 3. 4. echo filter_var($text, FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES | F ILTER_FLAG_ENCODE_AMP); 5. //Resultado: "Ontuts &amp; Cokidoo"

Obtener variables externas


Adems de la funcin filter_var, existe una muy interesante llamada filter_input. Esta funcion nos permite obtener una variable externa por su nombre, filtrndola si es necesario. Es importante que todas las variables externas, es decir, que nos llegan desde el lado del cliente ($_GET, $_POST, $_COOKIE) las obtengamos a travs de esta funcin para

ahorrarnos disgustos. En el siguiente ejemplo vemos como obtener un parmetro GET de la peticin con esta funcin:
view plaincopy to clipboardprint?

1. 2. 3. 4. 5. 6. 7. 8.

<php $page = filter_input(INPUT_GET, 'page', FILTER_VALIDATE_INT); if($page !== null && $page !== false){ //El parametro ha sido enviado y es un entero }else{ //El parametro no se ha enviado o no es un entero }

Esta funcin nos devolver NULL si la variable no ha sido enviada, FALSE si la variable ha sido enviada pero no validada o el valor de la variable si ha sido enviada y validada. El primer parmetro indica de que mbito ser extrada la variable, y puede ser uno de los siguientes valores:

INPUT_GET INPUT_POST INPUT_COOKIE INPUT_SERVER INPUT_ENV

Otra funcin relacionada y muy interesante es filter_input_array que nos permite definir una serie de validaciones para mltiples campos. Es decir, podemos hacer la validacin todos los campos de un formulario en un solo paso. La definicin de los campos con sus validaciones se hace mediante un array como se muestra en el siguiente ejemplo:
view plaincopy to clipboardprint?

1. <?php 2. $args = array( 3. 'product_id' => FILTER_SANITIZE_ENCODED, 4. 'component' => array('filter' => FILTER_VALIDATE_INT, 5. 'flags' => FILTER_REQUIRE_ARRAY, 6. 'options' => array('min_range' => 1, 'max_range' => 10) 7. ), 8. 'versions' => FILTER_SANITIZE_ENCODED 9. ); 10. 11. $myinputs = filter_input_array(INPUT_POST, $args);

Esta funcin devuelve un array del tipo clave/valor que contiene los nombres de los campos junto con su filtrado.

Conclusin

Como puedes observar, PHP nos brinda una gran librera con la cual podemos llevar a cabo validaciones y saneamientos en cuestion de segundos, cosa que antes se haca bastante engorrosa.

Tip PHP: Usar Filtrado de datos


Publicado el: 26 de abril 2011 por Hector A. Mantellini ( Xombra )

La programacin segura de PHP es esencial para no comprometer la seguridad de su servidor donde este alojada nuestra aplicacin web. Sanitizando y Validando nuestros datos aseguramos nuestra aplicacin, adems son sencillas de implementar.

Que es Sanitizar? Es el proceso de aplicar una limpieza exhaustiva a un dato o grupos de datos para su uso. Por ejemplo, FILTER_SANITIZE_EMAIL quita caracteres que no son los apropiados que contiene una direccin email. Que es Validar? Es el proceso utilizado para validar o comprobar si los datos cumplen con ciertos requisitos predefinidos. Por ejemplo, FILTER_VALIDATE_EMAIL determinar si los datos contienen una direccin vlida de correo electrnico, pero sin cambiar los datos en s. Ms sobre filtros: http://php.net/manual/es/book.filter.php Este ejemplo es tomado de php.net para sanear y validar una direccin email
<?php $a = 'joe@example.org'; $b = 'bogus - at - example dot org'; $c = '(bogus@example.org)'; $sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) { echo "Esta direccin de correo saneada (a) es vlida.\n"; } $sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) { echo "Esta direccin de correo saneada (b) es vlida.\n"; } else { echo "Esta direccin de correo saneada (b) no es vlida.\n"; } $sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL); if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) { echo "Esta direccin de correo saneada (c) es vlida.\n"; echo "Antes: $c\n";

echo "Despus: $sanitized_c\n"; } ?>

Aplicando filtros en nuestros cdigos nos aseguramos que los datos sean los que esperamos.

En la web de jQuery.com me encontr con un usuario que public un plugin para hacer listas dobles (es decir, el clsico: una lista con todas las opciones y los botoncitos para pasar a la otra los items que queremos), pero con una ms que interesante opcin de un campo de texto en la parte superior que sirve para filtrar aquellas opciones de nuestra lista segn el texto ingresado. Es ms difcil explicarlo que verlo. Las caractersticas que tiene, adems del potente filtro, son que pueden pasarse de una lista a otra, un elemento, muchos, muchos a la vez y lo mismo con quitarlos de la segunda lista. Hay muchos demos en la web del autor, pero me quedo con uno, la versin cross-browser, porque, hoy da, si un cdigo no funciona en todos los navegadores, entonces no sirve. Nunca podemos obligar a la gente a ver la web con el navegador que t quieres que la vea.

Una demo?
S, porque como explicndome soy psimo, mejor te dejo un link para que lo veas en funcionamiento y entenders de qu hablo.

La implementacin:
Muy fcil, slo agregar las libreras jquery y el plugin que se descarga desde la web del autor y un poco de cdigo html (ya no xhtml...)

Lo quiero...
Pues descrgatelo de este enlace.

Comentario:
Sera muy fcil rellenar la lista 1 (la que tiene todos los items) con contenido dinmico, simplemente debes reemplazar en el segundo cdigo que pongo aqu abajo la parte de los option con el resultado de tu consulta a la base de datos. Y recuerda que para que se procese el envo del formulario, la segunda lista debe llamarse con nombre de Array (es decir, con [ ] al final -sin espacio en el medio-) y debes usar algn script para seleccionar todos los items como, por ejemplo, ejecutar la funcin del cdigo 3 al hacer el submit.

Cdigo XHTML <script src="/scripts/jquery-1.3.2.min.js" type="text/javascript" language="javascript"></script> <script src="scripts/dlbScriptCrossBrowser.js" language="javascript" type="text/javascript"></script> Cdigo XHTML <table> <tr> <td> <div id="box1Group">

Filter: <input type="text" name="filter" /><button type="button" name="clear">X</button><br /> <select name="view" multiple="multiple" style="height:500px;width:300px;"> <option value="501649">2008-2009 "Mini" Baja</option> <option value="501497">AAPA - Asian American Psychological Association</option> <option <option <option <option <option <option <option <option <option <option <option <option <option <option value="501053">Academy of Film Geeks</option> value="500001">Accounting Association</option> value="501227">ACLU</option> value="501610">Active Minds</option> value="501514">Activism with A Reel Edge (A.W.A.R.E.)</option> value="501656">Adopt a Grandparent Program</option> value="501050">Africa Awareness Student Organization</option> value="501075">African Diasporic Cultural RC Interns</option> value="501493">Agape</option> value="501562">AGE-Alliance for Graduate Excellence</option> value="500676">AICHE (American Inst of Chemical Engineers)</option> value="501460">AIDS Sensitivity Awareness Project ASAP</option> value="500004">Aikido Club</option> value="500336">Akanke</option> </select><br/> <span class="countLabel"></span> <select name="storage" class="storageBox"> </select> </div> </td> <td> <button <button <button <button

id="to2" type="button"> > </button> id="allTo2" type="button"> >> </button> id="allTo1" type="button"> << </button> id="to1" type="button"> < </button>

</td> <td> <div id="box2Group"> Filter: <input type="text" name="filter" /><button type="button" name="clear">X</button><br /> <select name="view" multiple="multiple" style="height:500px;width:300px;"></select><br /> <span class="countLabel"></span> <select name="storage" class="storageBox"></select> </div> </td> </tr> </table> Cdigo JAVASCRIPT // esta funcin es nicamente para seleccionar todos los items de la lista antes del submit. Recuerda que el botn de enviar el formulario llame a esta funcin con un onclick=selectAllOptions('id_del_select_2'); function selectAllOptions(selStr) { var selObj = document.getElementById(selStr); for (var i=0; i<selObj.options.length; i++) { selObj.options[i].selected = true; } document.nombreformulario.submit();}

Tema: Busqueda PHP + MYSQL (Ledo 1176 veces) judoka


o
Mensajes: 255 Karma: 4 Sexo: Programando hasta lo mas alto. PHPero Avanzado

Busqueda PHP + MYSQL


en: 03 de Enero de 2011, 16:52:54 pm

Mi propsito es crear un buscador que evite buscar palabras con menos de 3 letras (preposiciones, conjunciones...) pero no se me ocurre ninguna manera de hacer ese filtro... de momento tengo lo siguiente: <?PHP $busqueda = substr($_POST['q'], 9); //Esto es por que en la busqueda aparece la palab ra "BUSQUEDA:" //CUENTA EL NUMERO DE PALABRAS $trozos=explode(" ",$busqueda); $numero=count($trozos); if ($numero==1) { //Si solo buscas una palabra... $query = mysql_query("SELECT * FROM noticias WHERE titulo LIKE '%".$busqueda." %' OR texto LIKE '%".$busqueda."%'"); if(mysql_num_rows($query)){ while ($noticia = mysql_fetch_array($query)) {

$comments = mysql_query("SELECT * FROM `comments` WHERE para='".$noticia['id' ]."'"); echo' <div class="article"> <h2><a href="index.php?pag=Ver&ID='.$noticia['id'].'">'.$noticia['titulo'].'</a ></span></h2> <p class="infopost">Publicado <span class="date">el '.$noticia['fecha'].'</span > por <a href="#">'.$noticia['autor'].'</a> | Archivado en <a href="index.php?pag=C

ategorias&cat='.$noticia['categoria'].'">'.$noticia['categoria'].'</a> <a href="index.php ?pag=Ver&ID='.$noticia['id'].'#Comentarios" class="com">Comentarios: <span>'.mysq l_num_rows($comments).'</span></a></p> <div class="clr"></div> <div class="img"><img src="images/article1.jpg" width="198" height="188" alt ="" class="fl" /></div> <div class="post_content"> <p>'.$noticia['texto'].'</p> </div> <div class="clr"></div> </div>'; } //while }else{ //num_rows echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda"; } } elseif ($numero>1) { //si buscas ms de 1 palabra... $query = mysql_query("SELECT *, MATCH (titulo, texto) AGAINST ( '%".$busqueda."%' ) FROM noticias WHERE MATCH (titulo, texto) AGAINST ( '%".$busqueda."%' IN BOOLEAN MODE ) LIMIT 15"); if(mysql_num_rows($query)){ while ($noticia = mysql_fetch_array($query)) {

$comments = mysql_query("SELECT * FROM `comments` WHERE para='".$noticia['id' ]."'"); echo' <div class="article"> <h2><a href="index.php?pag=Ver&ID='.$noticia['id'].'">'.$noticia['titulo'].'</a ></span></h2> <p class="infopost">Publicado <span class="date">el '.$noticia['fecha'].'</span > por <a href="#">'.$noticia['autor'].'</a> | Archivado en <a href="index.php?pag=C ategorias&cat='.$noticia['categoria'].'">'.$noticia['categoria'].'</a> <a href="index.php ?pag=Ver&ID='.$noticia['id'].'#Comentarios" class="com">Comentarios: <span>'.mysq l_num_rows($comments).'</span></a></p> <div class="clr"></div> <div class="img"><img src="images/article1.jpg" width="198" height="188" alt ="" class="fl" /></div> <div class="post_content"> <p>'.$noticia['texto'].'</p> </div> <div class="clr"></div> </div>';

} //while }else{ //num_rows echo "No encontramos ninguna publicaci&oacute;n que concuerde con su busqueda"; } } ?>
ltima modificacin: 14 de Enero de 2011, 22:10:49 pm por judoka En lnea

Comunidad PHPeros

Busqueda PHP + MYSQL


en: 03 de Enero de 2011, 16:52:54 pm

Re:Evitar la bsqueda de palabras de menos de..


Respuesta #1 en: 03 de Enero de 2011, 17:06:19 pm

for($i=0;$i<$numero;$i++) { if(strlen($trozos[$i]) <= 3) { unset($trozos[$i]); } } $busqueda = implode(' ', $trozos); $numero = substr_count($busqueda, ' ')+1; Esto deberias ponerlo entre $numero=count($trozos); y if($numero==1) { Como vers uso un for para recorrer cada palabra del array $trozos eliminando aquellas menores de 3 letras; luego lo uno por espacios y actualizo el numero de palabras en $numero. Re:Evitar la bsqueda de palabras de menos de..
Respuesta #5 en: 05 de Enero de 2011, 21:45:25 pm

Cita de: judoka en 04 de Enero de 2011, 01:40:09 am Tienes toda la razn TLX. Para aprender yo y que no tengis que darme el cdigo resuelto, me podras ayudar diciendome con que funciones puedo eliminar y hacer el filtro? De momento me has dicho que la coleccion la haga con arrays y luego haga un in_array para buscar si estn esas palabras en el texto, y luego que? borrar? Muchas gracias, un saludo!

Buenas, Vamos a explicarte brevemente como funcionara... Primero obtenemos nuestra cadena de bsqueda y palabras que queremos eliminar... $cadena = "Foros de programacion"; $cens = array("a","de","por","como","hasta"); Despus las separaremos creando un array, usando explode... $exp = explode(" ",$cadena); Esto devolvera: un array con datos: Foros, de, programacion similar a si pusieramos: array("Foros","de","programacion"); Entonces como bien ha dicho TLX deberamos buscar con in_array la palabra a eliminar como? Extraemos con foreach cada palabra del array $cens como $palcens & luego definimos si se encuentra en el array ya separado con explode ($exp). Despues buscamos la posicion de la palabra en nuestro array para definirlo como vaco en la cadena separada. foreach($cens As $palcens) { if(in_array($palcens,$exp)) { $arraysearch = array_search($palcens,$exp); $exp[$arraysearch] = ""; } } & despues solo nos quedara volver a montar nuestra cadena de bsqueda. <?php foreach($exp As $palexp) { $cadenanueva .= $palexp . " "; } Y as podramos tener una funcin simple & casera!

Buscador completo
Respuesta #8 en: 09 de Enero de 2011, 16:21:11 pm

Bueno, bueno... maravilloso !! Me ha servido perfectamente y lo tengo comprendido Una dudilla, estoy haciendo para que me "destaque" las palabras que he buscado. En principio, mi idea es con un array para que no distinga entre maysculas y minsculas: $sub=array(strtolower($nbusqueda),strtoupper($nbusqueda),ucwords(strtolower($nbus queda))); Y luego unos str_replace para que me destaque las palabras: $texto=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','GALERIA'); $titulo=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','Galeria de imagenes'); En total quedara algo as: $nbusqueda = "Galeria"; $sub=array(strtolower($nbusqueda),strtoupper($nbusqueda),ucwords(strtolower($nbus queda))); $texto=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','GALERIA'); $titulo=str_replace($sub,'<i><b>'.$nbusqueda.'</b></i>','Galeria de imagenes'); echo $titulo."<br>".$texto De momento hace su funcin, pero he topado con el problema de que si la palabra contiene algo antes o despus(ya sean parntesis, exclamaciones, interrogaciones...) no la destaca, ya que busca la palabra suelta. A ver si me explico: ESTO SI LO ENCUENTRA Y HACE LO SIGUIENTE: Galeria de imagenes ESTO NO LO ENCUENTRA Y CON LO CUAL SE QUEDA IGUAL: Galeria de imagenes!! Haba pensado hacer algo as como en las querys con los "%", pero no s hacerlo por desgracia. Qu me recomiendan para enmendar mi problema?

hola: alguien me puede ayudar como hacer para mostar que se muestre sola la letra "E" por ejemplo que la contiene dato_1, este es el codigo, gracias

-------------------------------------<? /////****PAGINADOR*****///////// $pagina = $_GET["p"]; $registros = 10; if (!$pagina) { $inicio = 0; $pagina = 1; } else { $inicio = ($pagina - 1) * $registros; } $paginaActual="Hoja_3.php?"; $queryTotalRegistros="SELECT * FROM catalogo WHERE dato_4 = 'Hoja_3' AND estado = 1 ORDER BY dato_1 ASC"; $resultados = mysql_query($queryTotalRegistros); $total_registros = mysql_num_rows($resultados); $queryTotalRegistros= "SELECT * FROM catalogo WHERE dato_4 = 'Hoja_3' AND estado = 1 ORDER BY dato_1 ASC LIMIT $inicio, $registros"; $resultados = mysql_query($queryTotalRegistros); $total_paginas = ceil($total_registros / $registros); ////////*****FIN********/////////// if($total_registros > 0) { for($i=0; $i<@mysql_num_rows($resultados); $i++) { $cuando = "hoy por la ma&ntilde;ana"; $IDCatalogo = mysql_result($resultados,$i,"IDCatalogo"); $dato_1 = mysql_result($resultados,$i,"dato_1"); $dato_2 = mysql_result($resultados,$i,"dato_2"); $dato_3 = mysql_result($resultados,$i,"dato_3"); $dato_5 = mysql_result($resultados,$i,"dato_5"); $dato_6 = mysql_result($resultados,$i,"dato_6"); $dato_7 = mysql_result($resultados,$i,"dato_7");

$imagen = mysql_result($resultados,$i,"imagen"); ?>

hola chic@s estoy buscando un buscador en tiempo real esto es todo lo que eh podido encontrar si sabeis aqui estoy para apoyar y para dar con la respuesta saludos.
Cdigo PHP:

<html> <head> <!-- Buscador en JavaScript --> <SCRIPT LANGUAGE='JavaScript'> var numeroPaginas=10; //PAGINAS TOTALES var numeroDatos=4; //DATOS POR PAGINA (descr,pal clave, link, titu lo) var baseDatos=new Array(numeroPaginas); for (i=0; i<numeroPaginas; i++) //ES PARA CREAR LOS CUATRO DATOS DE CA DA PAGINA { baseDatos=new Array(numeroDatos); } <!-- Creacin de la base de datos --> baseDatos[0][0]="http://dalila.sip.ucm.es/miembros/olga/colores"; baseDatos[0][1]="Colores RGB"; baseDatos[0][2]="El propsito de esta pgina es mostrarte cmo especif icar colores uniformes en HTML"; baseDatos[0][3]="html,colores,RGB"; <!-- --> baseDatos[1][0]="http://dalila.sip.ucm.es/miembros/olga/dimensionado"; baseDatos[1][1]="Dimensionado de Imgenes"; baseDatos[1][2]="Incluir imgenes en una pgina web es muy sencillo"; baseDatos[1][3]="imagen,jpg,jpeg,gif,html"; <!-- --> baseDatos[2][0]="http://dalila.sip.ucm.es/miembros/olga/tablas";

baseDatos[2][1]="Las Tablas en HTML"; baseDatos[2][2]="Las tablas son uno de los elementos ms verstiles de HTML. Permiten mostrar la informacin de una manera compacta y clara. "; baseDatos[2][3]="fila,columna,celda,tabla,html"; <!-- --> baseDatos[3][0]="http://dalila.sip.ucm.es/miembros/olga/form"; baseDatos[3][1]="Los Formularios en HTML"; baseDatos[3][2]="HTML permite emplear los llamados formularios, para q ue el usuario pueda enviar informacin hacia el servidor."; baseDatos[3][3]="formularios,validacion,javascript,html"; <!-- --> baseDatos[4][0]="http://dalila.sip.ucm.es/miembros/olga/frames"; baseDatos[4][1]="Los Frames en HTML"; baseDatos[4][2]="El uso de marcos (frames) es una tcnica muy utilizad a en la actualidad."; baseDatos[4][3]="frame,marco,target,html"; <!-- --> baseDatos[5][0]="http://dalila.sip.ucm.es/miembros/olga/enlaces"; baseDatos[5][1]="Marcos y Enlaces"; baseDatos[5][2]="Si tienes algo de experiencia en esto de la navegaci n por Internet, te habrs dado cuenta de que en algunas pginas los ma rcos pueden anidarse interminablemente."; baseDatos[5][3]="marcos,enlaces,target,html"; <!-- --> baseDatos[6][0]="http://dalila.sip.ucm.es/miembros/olga/mapas"; baseDatos[6][1]="Ejemplo de Mapa"; baseDatos[6][2]="En HTML, se denomina mapa a la imagen utilizada para enlazar con varias pginas, yendo a una u otra segn la zona sobre la que se pulse el ratn."; baseDatos[6][3]="mapa,imagen,html"; <!-- --> baseDatos[7][0]="http://dalila.sip.ucm.es/miembros/olga/javas"; baseDatos[7][1]="Ejemplos de JavaScript"; baseDatos[7][2]="Aqu podrs encontrar algunas aplicaciones de JavaScr ipt para que puedas mejorar la presentacin de tus pginas web." baseDatos[7][3]="scripts,ventanas,scrolls,eventos,javascript"; <!-- --> baseDatos[8][0]="http://dalila.sip.ucm.es/miembros/basico"; baseDatos[8][1]="Nociones Bsicas de JavaScript"; baseDatos[8][2]="En esta pgina encontrars las nociones bsicas sobre JavaScript que necesitas para mejorar tus pginas web."; baseDatos[8][3]="variables,bucles,funciones,eventos,cajas,arrays,javas cript"; <!-- --> baseDatos[9][0]="http://dalila.sip.ucm.es/miembros/olga/arrays"; baseDatos[9][1]="Los Arrays en JavaScript"; baseDatos[9][2]="Los arrays son un elemento extremadamente importante en cualquier lenguaje de programacin."; baseDatos[9][3]="arrays,arrays densos,arrays bidimensionales,javascrip t"; <!-- --> var var var var sinAcento=new Array('a','e','i','o','u'); conAcento=new Array('','','','',''); entradasResultado=""; paginaResultados="";

function prepararPalabra(palabra) //PONE LA PALABRA EN MINUSCULAS Y SI N TILDES { var resultado=""; var longitud; //DEVUELVE EL REULTADO

resultado=palabra.toLowerCase(); longitud=resultado.length; for (i=0; i<5; i++) { posicion=resultado.indexOf(conAcento); while (posicion!=-1) { resultado=resultado.substring(0,posicion)+sinAcento+resultado.substr ing(posicion+1,longitud); posicion=resultado.indexOf(conAcento);} } return resultado; } function buscarPalabra(palabra,desde) //SI ENCUENTRA LA PALABRA DESDE DESDE EN ALGUNA BASEDATOS { var indice=-1; //MODIFICA EL INDICE CON EL N DE BASEDATOS for (i=desde; i<numeroPaginas; i++) //DEVUELVE EL INDICE EN NUMERO if (baseDatos[0].search(palabra)!=1 || baseDatos[1].search(palabra)!=-1 || baseDatos[2].search(palabra)!=-1 || baseDatos[3].search(palabra)!=-1) { indice=i; break; } return indice; } function principioPagina(palabra,cantidad) //PRINCIPIO DE PAGINA { paginaResultados+="<HTML><HEAD><TITLE>Resultados de la bsqueda</TIT LE></HEAD>"+ "<BODY BGCOLOR='#FFFFFF'><FONT FACE='helvetica'><CENTER>"+ "<FONT SIZE=+2><B>Resultados de la bsqueda</B></FONT><HR NOSHADE></CE NTER>"; if (cantidad==0) paginaResultados+="<P>Lo sentimos, no se han obtenido resultados para la palabra " else paginaResultados+="<P>Se ha(n) encontrado "+cantidad+" resultado( s) relacionados con "; paginaResultados+="<FONT COLOR='#0000FF'><B>"+palabra+"</B></FONT>.<BR >" } function anyadirEntrada(posicion) //PONE UN RESULTADO (TITULO+BR+DESCR ) { entradasResultado+="<P><A HREF='"+baseDatos[posicion][0]+".html'>"+b aseDatos[posicion][1]+"</A><BR>" +baseDatos[posicion][2]; } function finalPagina() // EL FINAL DE LA PAGE { paginaResultados+="<BR><BR><BR>(R)</BODY></HTML>"; } function buscador(palabra) //EL BUSCADOR COMPLETO { numeroResultados=0; paginaResultados=""; entradasResultado=""; var buscada=prepararPalabra(palabra); var claveBuscada=new RegExp(buscada); indice=-1; do { indice=buscarPalabra(claveBuscada,indice+1); if (indice!=-1) { anyadirEntrada(indice);

numeroResultados++; } } while (indice!=-1) principioPagina(buscada,numeroResultados); paginaResultados+=entradasResultado; finalPagina(); mostrarVentana(paginaResultados); } function mostrarVentana(pagina) { opciones="toolbar=0,status=0,menubar=0,"+ "resizable=0,scollbars=1,width=575,height=450"; nuevaVentana=window.open("","",opciones) nuevaVentana.document.close(); nuevaVentana.document.open(); nuevaVentana.document.write(pagina); } </SCRIPT> </head> <body> <FORM NAME='entrada'> <CENTER> <TABLE> <TR> <TD><FONT FACE='helvetica'><B>Palabra clave:</B></FONT></TD> <TD><INPUT TYPE='text' NAME='dato' SIZE=18></TD> <TD><FONT FACE='helvetica'><INPUT TYPE='button' VALUE='Buscar' onClick="buscador(document.entrada.dato.value)"></FONT></TD> <TD><FONT FACE='helvetica'><INPUT TYPE='button' VALUE='Borrar' onClick="document.entrada.dato.value=''"></FONT></TD> </TR> </TABLE> </FORM> </body> </html>
Avisos Google

S-ar putea să vă placă și