Foros del Web » Programando para Internet » PHP »

Comodin en substr_count

Estas en el tema de Comodin en substr_count en el foro de PHP en Foros del Web. Quiero contar los encabezados(h1) de una página que contengan el criterio que le indico. $c_encabezado_kw=substr_count("$string", "<h1>$criterio</h1>"); funciona, pero claro me cuenta solo los encabezados (h1) ...
  #1 (permalink)  
Antiguo 24/06/2003, 12:27
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Comodin en substr_count

Quiero contar los encabezados(h1) de una página que contengan el criterio que le indico.

$c_encabezado_kw=substr_count("$string", "<h1>$criterio</h1>");

funciona, pero claro me cuenta solo los encabezados (h1) que contengan unicamente el criterio y me interesa que me lo cuenta aunque haya palabras delnate y detrás, he probado con
$c_encabezado_kw=substr_count("$string", "<h1>(.*)$criterio(.*)</h1>");

pero no funciona.

Cual es el comodin" que debería usar?


Un saludo y gracias.
  #2 (permalink)  
Antiguo 24/06/2003, 12:29
Avatar de Sexma  
Fecha de Ingreso: junio-2003
Ubicación: Valencia
Mensajes: 109
Antigüedad: 14 años, 6 meses
Puntos: 0
No se si en php se pueden utilizar expresiones regulares. Has mirado si lo acepta?
  #3 (permalink)  
Antiguo 24/06/2003, 12:36
Avatar de Sexma  
Fecha de Ingreso: junio-2003
Ubicación: Valencia
Mensajes: 109
Antigüedad: 14 años, 6 meses
Puntos: 0
Pues mirando en el manual de php si que acepta las expresiones regulares. Aqui tienes una URL que lo explica todo

http://es2.php.net/manual/es/html/pc...rn.syntax.html
  #4 (permalink)  
Antiguo 24/06/2003, 16:45
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Teóricamente como lo he hecho es correcto no?

No me aclaro, me podeis ehchar un cable plis?

Un saludo.
  #5 (permalink)  
Antiguo 24/06/2003, 17:18
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Teóricamente no es correcto .. pues esa "sintax" de uso de comodines es própia de Expresiones regulares .. y la función substr_count() no es una función para uso de Expresiones regulares ..

Para eso tienes funciones como preg_match_all() .. o erg(). PHP puede trabajar con dos típos de Expresiones regulares: Las compatibles con PERL y las POXIS

Funciones compatibles Perl par Exp. Reg:
http://www.php.net/manual/en/ref.pcre.php

Funciones compatibles POXIS Extended:
http://www.php.net/manual/en/ref.regex.php

Y un tutorial sobre Expresiones regulares aplicadas a PHP:
http://www.ignside.net/man/php/regex.php

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 25/06/2003, 07:21
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Muchas gracias a todos, de momento no encuentro la solución pero sigo probando.

Un saludo y gracias de nuevo.
  #7 (permalink)  
Antiguo 25/06/2003, 09:31
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
Nose si entendemos mal o entiendo yo mal el problema, la funcion substr_count cuenta el numero de apariciones de una cadena dentro de una subcadena, es decir si tenemos:

Código PHP:
$subcadena "Esto es una prueba";
$cadena       "es";
echo 
substr_count($subcadena$cadena); 
Eso te devolveria 1.

El caso es que esa función no sporta espreciones regulares.

La solución sería dividir la cadana segun los <h1>(.*)</h1> y asi tener un array de datos, contar ese array y tendras el número de apariciones . Serí algo así:

Código PHP:
$array_datos split("<h1>(.*)</h1>"$cadena);
echo 
count($array_datos); 
De tal manera que te podrias hacer:

Código PHP:
function substr_count_regex($pattern$cadena)
{
$array_datos split($pattern ,$cadena);
return 
count($array_datos);

De esa manera indicas en el pattern lo que quieres buscar con el patron que quieras y la cadena
__________________
Usuario registrado de Linux #288725
  #8 (permalink)  
Antiguo 25/06/2003, 10:56
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Creo que no me he explicado bien.

Tengo un formulario donde pide una url y u criterio(palabra).

Y quiero que me diga cuantas veces aparece un encabezado de la web (<h1>lokesea</h1>) que contenga dicho criterio.

$string = implode ('', file ($url)); //Cojo la url

$c_encabezado=substr_count("$string", "<h1>"); //Calculo el numero de encabezados

$c_encabezado_kw=substr_count("$string", <h1>(.*)$criterio(.*)</h1>); //aqui esta el priblema

echo $c_encabezado_kw; //Muestro el resultado

En la penultima linea es donde fallo, quiero que me muestre el numero de encabezados que contienen el criterio, por ejemplo:

tengo en una web un encabezado que es <h1>Esta es mi página</h1> y el criterio es "mi", entonces me lo cuenta ya que entre las etiquetas h1 aparece el criterio.


Con el siguiente codigo me cuenta solo cuando entre las etiquetas h1 aparece UNICAMENTE el criterio, y quiero que me o cuente aunque haya palabras delante y detras:

$c_encabezado_kw=substr_count("$string", <h1>$criterio</h1>);


Un salutti y gracias.
  #9 (permalink)  
Antiguo 25/06/2003, 11:24
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
pos para eso te puse la funcion!!!! haz uso de ella :D
__________________
Usuario registrado de Linux #288725
  #10 (permalink)  
Antiguo 25/06/2003, 12:02
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
No funciona :( , no me muestra el resultado.

$string = implode ('', file ($url));

$pattern="<h1>(.*)$criterio(.*)</h1>";
function substr_count_regex($pattern, $string)
{
$array_datos = split($pattern ,$string);
return count($array_datos);
}


Cual es el fallo? pattern debe ser el criterio a buscar no?

Un saludo y perdon por ser tan pesado :P
  #11 (permalink)  
Antiguo 25/06/2003, 12:42
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
De todas formas (no me pregunten) se puede hacer de un "viaje" con expresiones regulares .. Tal vez con preg_match_all() o similares .. Pero ya dije que lo mio no son las Exp. reg ..

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 26/06/2003, 05:37
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
De momento no he conseguido que funcione, seguiré probando, si al final resuelvo el problema lo posteo por si hay algún usuario que tubiera mi misma duda.

Un saludo y gracias a todos.
  #13 (permalink)  
Antiguo 26/06/2003, 14:17
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
Claro no te funciona por k no estas usando la funcion !!! solo la declaras haz uso de ella lexes!!!!

Código PHP:
$string implode (''file ($url));

$pattern="<h1>(.*)$criterio(.*)</h1>";
function 
substr_count_regex($pattern$string)
{
$array_datos split($pattern ,$string);
return 
count($array_datos);
}
substr_count_regex($patern$string); // aki hago uso de la funcion 
__________________
Usuario registrado de Linux #288725
  #14 (permalink)  
Antiguo 26/06/2003, 14:49
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Quizás fuera por eso xD

Lo he hecho tal cual me has dicho y me sale el siguiente error:

Warning: split() [function.split]: REG_EMPTY in /home/virtual/site61/fst/var/www/html/lee-metas/prueba.php on line 8

Me da un error en la line de split :(

Pq?
  #15 (permalink)  
Antiguo 27/06/2003, 07:30
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
substr_count_regex($patern, $string);

Ahi fala una t a $pattern joder nos podriamos fijar eh!! esto solo son ideas.

substr_count_regex($pattern, $string);
__________________
Usuario registrado de Linux #288725
  #16 (permalink)  
Antiguo 27/06/2003, 10:29
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bueno, creo que es hora de dar la bienvenida a nuestras amigas, las "Expresiones Regulares"...

Código PHP:
<?
function buscando($buscado,$cadena){
    
$buscar[0]=strtoupper($buscado);
    
$buscar[1]=strtolower($buscado);
    
$buscar[2]=ucfirst($buscar[1]);
    
$patron="/(<[h|H]1[A-Za-z0-9 \"=]*>)(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(<\/[h|H]1>)/";
    
$busqueda=preg_match_all($patron,$cadena,$salida);
    
$resultado["cuantos"]=count($salida[0]);
    foreach (
$salida[0] as $valor){
        
$resultado["textos"][]=$valor;
    }
    return 
$resultado;
}
// AQUI TERMINA LA FUNCION, AHORA LA PROBAMOS

// PRIMERO CREAMOS UNAS VARIABLES PARA USARLAS EN LA FUNCION
$buscado="prueba";
$cadena= <<<HTML
    <html>
    <head>
    <title>Pagina de Prueba</title>
    </head>
    <body>
    <h1>Esta es una Prueba</h1>
    <p>Aqui hay un parrafo intermedio</p>
    <h1 class="encabezado">Esta prueba es mas compleja</h1>
    <h1>Este no trae el texto buscado</h1>
    <h1> Pero esta si dice "prueba"</h1>
    </body>
    </html>
HTML;

// AHORA LLAMAMOS A LA FUNCION
$prueba=buscando($buscado,$cadena);

// Ahora vamos a ver los resultados

echo "Cantidad de Coincidencias: ".$prueba["cuantos"]."<br>\n";
echo 
"Estas fueron las Coincidencias: <br>\n";
echo 
"<UL>\n";
foreach (
$prueba["textos"] as $p){
    echo 
"<LI>".htmlspecialchars($p)."</LI>\n";
}

?>

Pruebalo, creo que es lo que necesitas...

Saludos!
__________________
Manoloweb
  #17 (permalink)  
Antiguo 27/06/2003, 10:33
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Por cierto, el resultado de la prueba es:

Cantidad de Coincidencias: 3
Estas fueron las Coincidencias:

* <h1>Esta es una Prueba</h1>
* <h1 class="encabezado">Esta prueba es mas compleja</h1>
* <h1> Pero esta si dice "prueba"</h1>
__________________
Manoloweb

Última edición por Manoloweb; 27/06/2003 a las 10:36
  #18 (permalink)  
Antiguo 27/06/2003, 15:18
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
No es necesario hacer uso del motor de expresiones regulares para ello ya que split lo hace simplemente hay que saber usarlo, sino revisen los comentarios del manual oficial que para eso estan!!! ponen la misma funcion que yo lo unico que lo implementan con explode en vez de con split, explode es mas rapido pero no soporta regex asi k ahi keda el dato
__________________
Usuario registrado de Linux #288725
  #19 (permalink)  
Antiguo 27/06/2003, 19:18
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Voy a llorar,
en el codigo de manoloweb me da un Parse error: parse error en la linea de $prueba=buscando($buscado, $cadena);

y en el codigo de epplestun en la linea del split.

:(

PHP Version 4.3.1, puede ser por la versón de php?

Gracias a los 2 por los codigos.
  #20 (permalink)  
Antiguo 27/06/2003, 21:15
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
Ya te dije cual era mi error, revisalo!!
__________________
Usuario registrado de Linux #288725
  #21 (permalink)  
Antiguo 28/06/2003, 05:12
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
No no, si no es pro la t. El problema es que SIEMPRE me da 2 xDDD

he creado una pagina con un solo encabezado para hacer pruebas y siempre me da 2.

Si canbio el reden de las variables en el split ( primero string y luego pattern) me da siempre 1.

Lo de la t ya me habñia fijado, el problema no sé donde está pero me he fijado en lo siguiente.

En substr_count primero va el string y luego en citerio, en substr_count_regex es viceversa?

he probado a colocar las variables como en el substr_count pero sigue pasando lo mismo, siempre me da 2 :(

Siento ser tan pesado.
  #22 (permalink)  
Antiguo 28/06/2003, 08:47
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Código PHP:
<?
function buscando($buscado,$cadena){
    
$buscar[0]=strtoupper($buscado);
    
$buscar[1]=strtolower($buscado);
    
$buscar[2]=ucfirst($buscar[1]);
    
$patron="/(<[h|H]1[A-Za-z0-9 \"=]*> )(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(</[h|H]1> )/";
     
$busqueda=preg_match_all($patron,$cadena,$salida);
    
$resultado["cuantos"]=count($salida[0]);
    foreach (
$salida[0] as $valor){
        
$resultado["textos"][]=$valor;
    }
    return 
$resultado;
}
/* Aqui empieza tu codigo */
$string implode (''file ($url)); //Cojo la url
$criterio AQUI PONES TU CRITERIO 

// AHORA LLAMAMOS A LA FUNCION
$prueba=buscando($criterio,$string);

// Ahora vamos a ver los resultados

echo "Cantidad de Coincidencias: ".$prueba["cuantos"]."<br>\n";
echo 
"Estas fueron las Coincidencias: <br>\n";
echo 
"<UL>\n";
foreach (
$prueba["textos"] as $p){
    echo 
"<LI>".htmlspecialchars($p)."</LI>\n";
}
?>
__________________
Manoloweb
  #23 (permalink)  
Antiguo 28/06/2003, 09:22
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
DIOS!!!

Bueno criterio lo he llamado buscado y string cadena ya que al declarar la funcion has usado estos nombres.

he quitado los foreach para simplificar el problema.

el codigo queda asñi

<?
function buscando($buscado,$cadena)
{
$buscar[0]=strtoupper($buscado);
$buscar[1]=strtolower($buscado);
$buscar[2]=ucfirst($buscar[1]);
$patron="/(<[h|H]1[A-Za-z0-9 \"=]*> )(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(</[h|H]1> )/";
$busqueda=preg_match_all($patron,$cadena,$salida);
$resultado["cuantos"]=count($salida[0]);
return $resultado;
}
/* Aqui empieza tu codigo */
$cadena = implode ('', file ("http://www.agreguelo.com/"));
$buscado ="NOTA";

// AHORA LLAMAMOS A LA FUNCION
$prueba=buscando($buscado,$cadena);

// Ahora vamos a ver los resultados

echo "Cantidad de Coincidencias: ".$prueba["cuantos"]."<br>\n";
?>


me da este error: Warning: Unknown modifier '[' in /home/virtual/site61/fst/var/www/html/lee-metas/pruebecita.php on line 8
Cantidad de Coincidencias: 0

Al decir lo del [ he probado colocnadolo al final de la bariable salida pero me sigue dando el mismo error.

Cuando acabe con esto me comentais de cuanto debe ser el cheque por la ayuda :P



Es la linea:
$busqueda=preg_match_all($patron,$cadena,$salida);

La variable busqueda no es usada en ningun sitio. He probado a dejar solo el preg_match_all sin meterlo en la variable pero no me funciona. :(
  #24 (permalink)  
Antiguo 28/06/2003, 10:36
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bueno, no entiendo porque a mi me ha funcionado correctamente en mi localhost, prueba escapando la diagonal antes del cierre:

$patron="/(<[h|H]1[A-Za-z0-9 \"=]*> )(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(<\/[h|H]1> )/";
__________________
Manoloweb
  #25 (permalink)  
Antiguo 28/06/2003, 10:50
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
PFFFFFFFFFFFF,

Siempre da 0 :(


<?
function buscando($buscado,$cadena)
{
$buscar[0]=strtoupper($buscado);
$buscar[1]=strtolower($buscado);
$buscar[2]=ucfirst($buscar[1]);
$patron="/(<[h|H]1[A-Za-z0-9 \"=]*> )(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(<\/[h|H]1> )/";
$busqueda=preg_match_all($patron,$cadena,$salida);
$resultado['cuantos']=count($salida[0]);
return $resultado;

}
/* Aqui empieza tu codigo */
$cadena = "<html>
<head>
<title>Pagina de Prueba</title>
</head>
<body>
<h1>Esta es una Prueba</h1>
<p>Aqui hay un parrafo intermedio</p>
<h1>Este no trae el texto buscado</h1>
<h1> Pero esta si dice prueba</h1>
</body>
</html>";
$buscado = "prueba";

// AHORA LLAMAMOS A LA FUNCION
$prueba=buscando($buscado, $cadena);

// Ahora vamos a ver los resultados

echo "Cantidad de Coincidencias: ".$prueba['cuantos']."<br>\n";
?>

tendría que dar 2 y da 0, las comillas de prueba [cuantos] con dobles tp funciona .

Manoloweb gratis por tu ayuda, de verdad.
  #26 (permalink)  
Antiguo 28/06/2003, 11:05
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Código PHP:
<?
function buscando($buscado,$cadena)
{
$buscar[0]=strtoupper($buscado);
$buscar[1]=strtolower($buscado);
$buscar[2]=ucfirst($buscar[1]);
$busqueda=preg_match_all("/(<[h|H]1[A-Za-z0-9 \"=]*>)(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(<\/[h|H]1>)/",$cadena,$salida); 
$resultado['cuantos']=count($salida[0]);
return 
$resultado;

}
/* Aqui empieza tu codigo */
$cadena "<html>
<head>
<title>Pagina de Prueba</title>
</head>
<body>
<h1>Esta es una Prueba</h1>
<p>Aqui hay un parrafo intermedio</p>
<h1>Este no trae el texto buscado</h1>
<h1> Pero esta si dice prueba</h1>
</body>
</html>"
;
$buscado "prueba";

// AHORA LLAMAMOS A LA FUNCION
$prueba=buscando($buscado$cadena);

// Ahora vamos a ver los resultados

echo "Cantidad de Coincidencias: ".$prueba['cuantos']."<br>\n";
?>
Probado y funcionando AQUI
__________________
Manoloweb

Última edición por Manoloweb; 28/06/2003 a las 11:08
  #27 (permalink)  
Antiguo 28/06/2003, 11:09
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
No se por que el foro le esta quitando algunos caracteres...

ESTA linea es la buena...

$busqueda=preg_match_all("/(<[h|H]1[A-Za-z0-9 \"=]*>)(.*)(".$buscar[0]."|".$buscar[1]."|".$buscar[2].")(.*)(<\/[h|H]1>)/",$cadena,$salida);
__________________
Manoloweb
  #28 (permalink)  
Antiguo 28/06/2003, 11:12
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Por si las dudas...

el codigo que esta funcionando en la prueba, puedes accesarlo aqui: http://www.ideasfreelance.com/pruebas/index.txt
__________________
Manoloweb
  #29 (permalink)  
Antiguo 28/06/2003, 18:23
 
Fecha de Ingreso: febrero-2002
Mensajes: 139
Antigüedad: 15 años, 9 meses
Puntos: 0
Joder, muchísimas gracias de verdad.

Ahora SÍ que me funciona.

Un saludo y gracias de nuevo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:54.