Foros del Web » Programando para Internet » PHP »

Buscar y Buscar dentro de Cadenas

Estas en el tema de Buscar y Buscar dentro de Cadenas en el foro de PHP en Foros del Web. Hola chicos, estoy un poco atascado con un PHP y me gustaría que me echasen una manita... Gracias de Antemano. Os explico lo que quiero ...
  #1 (permalink)  
Antiguo 12/07/2011, 11:17
Avatar de Z3R0N3  
Fecha de Ingreso: junio-2010
Ubicación: En algún lugar de la mancha de cuyo nombre no quiero acordarme...
Mensajes: 73
Antigüedad: 13 años, 10 meses
Puntos: 4
Buscar y Buscar dentro de Cadenas

Hola chicos, estoy un poco atascado con un PHP y me gustaría que me echasen una manita... Gracias de Antemano.


Os explico lo que quiero hacer;


(ESTO NO ES IMPORTANTE :: Perdón por las mayúsculas)

En primer lugar, un "archivo.php" recibe por POST todo el contenido HTML de una página.

Éste "archivo.php" se encarga de modificar dicho contenido HTML para generar otro distinto.


(ESTO SI ES IMPORTANTE :: Perdón por las mayúsculas)


¿Qué necesito? Pues bien, me gustaría extraer ciertas STRINGs o Cadenas que existan dentro del contenido que recibo, y dentro de estas cadenas, encontrar unos enlaces que existen dentro de ellos. Es decir, lo explico con un ejemplo:


Código:
$cadenaHTML = '

Aquí un desparrame de código HTML

onclick="return confirmar('http://www.laweb.es/Documentos/webflv1308325486171.flv', '0', 2);"

más código HTML

onclick="return confirmar('http://www.laweb.es/Documentos/webflv1308325540890.flv', '1', 2);"

más código HTML

onclick="return confirmar('http://www.laweb.es/Documentos/ARCHIVOS/d0ab59150_folder.png', '0', 1);"

más código HTML

onclick="return confirmar('http://www.laweb.es/Documentos/ARCHIVOS/d0ab59150_mensaje 128px.png', '1', 1);"


Aquí termina el resto de código HTML.
';

Pues bien, suponed que eso es lo que recibo por $_POST.

Lo que quiero es extraer todos los "onclick" y dentro de éstos todas las URL completas que aparezcan.



Tengo algo de código tirado y consigo reemplazar todos los "onclick" por espacios vacios pero en ningún momento consigo extraer las URL's.


Aquí pongo el código que tengo para comprobar que ha encontrado todos los "onclick" y los ha vaciado (para asegurarme de que encuentra todos, en realidad habría que eliminar esa función o bien reemplazarla por la búsqueda de las URL's).


Código:
// Aquí compruebo que en el contenido recibo existe "onclick" y " );" " para proceder a seguir.

		if((stristr($contenidorecibido, 'onclick') == true) && (stristr($contenidorecibido, ');"') == true)) {


// Ahora cuenta el nº de "onclick" que ha encontrado para entrar en un For y recorrerlos.

			$contadorPartes = substr_count($contenidorecibido, 'onclick');
			for ($f = 0; $f < $contadorPartes; $f++) {

// En la variable $extraerContenido extraigo el contenido realizado desde el primer delimitador 'onclick="return ' al segundo delimitador que sería ');"' para almacenarlo en la misma variable.


			$extraerContenido = 'onclick="return '.getContentFromDelimiters($contenidorecibido, 'onclick="return ', ');"').');"';


// Por último reemplazo las cadenas encontradas "onclick" por vacías ya que así tengo una muestra visual de que se ha machacado todas. ( "Ha encontrado todos los 'onclick' ).

			$limpiador3 = str_replace($extraerContenido, '', $contenidorecibido);
			$contenidorecibido = $limpiador3;
			}
		}


En el código anterior llamo a 1 función pero aquí pongo las 2 funciones que estoy usando.


- La primera para buscar el contenido que haya entre 2 delimitadores.

- La segunda para buscar las URL's dentro de la STRING que le pase.


Aquí os pego el código:


Código:
function getContentFromDelimiters($string, $start, $end) {
        $pos = stripos($string, $start);
        $str = substr($string, $pos);
        $str_two = substr($str, strlen($start));
        $second_pos = stripos($str_two, $end);
        $str_three = substr($str_two, 0, $second_pos);
        $unit = trim($str_three);
		return $unit;
}

function tieneUrls($cuerpo){
stripslashes($cuerpo);
$regex = '$\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]$i'; 
if (preg_match_all($regex, $cuerpo, $result, PREG_PATTERN_ORDER))
return $result;
}


Bueno, espero que puedan echarme un cable ya que nose por qué me he quedado atascado por completo.

Y ya saben, lo que busco es extraer todos los "onclick" y dentro de éstos todas las URL completas que aparezcan.


Bueno espero que me puedan echar un cable. Muchísimas Gracias nuevamente y Saludos.
  #2 (permalink)  
Antiguo 12/07/2011, 11:36
Avatar de ZoroRoronoa  
Fecha de Ingreso: marzo-2011
Ubicación: California, USA
Mensajes: 824
Antigüedad: 13 años
Puntos: 116
Respuesta: Buscar y Buscar dentro de Cadenas

podrias usar javascript y inputs hidden.
Al hacer clic, das el valor de la url a los input ocultos y mediante POST los obtienes en tu archivo que genera el contenido.

Saludos

(Aunque hay mas alternativas).
__________________
Programador jQuery & PHP
  #3 (permalink)  
Antiguo 12/07/2011, 11:39
Avatar de Z3R0N3  
Fecha de Ingreso: junio-2010
Ubicación: En algún lugar de la mancha de cuyo nombre no quiero acordarme...
Mensajes: 73
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Buscar y Buscar dentro de Cadenas

Cita:
Iniciado por ZoroRoronoa Ver Mensaje
podrias usar javascript y inputs hidden.
Al hacer clic, das el valor de la url a los input ocultos y mediante POST los obtienes en tu archivo que genera el contenido.

Saludos

(Aunque hay mas alternativas).


Llevas toda la razón de echo así lo tengo echo. Pero el problema no es recibir los datos, (los recibo divinamente).

Sino, una vez son recibidos y tratados como si de una cadena entera fuera, encontrar dentro todos los "onclick" y dentro de éstos, todas las "urls" que aparezcan.
  #4 (permalink)  
Antiguo 12/07/2011, 12:34
Avatar de andres_aquino  
Fecha de Ingreso: septiembre-2010
Ubicación: $("#place").html("FDW");
Mensajes: 138
Antigüedad: 13 años, 7 meses
Puntos: 24
Respuesta: Buscar y Buscar dentro de Cadenas

Así como dijo ZoroRoronoa, podrías usar javascript para poder extraer todos los onclick y dentro de estas, usar las expresiones regulares de javascript y realizar el cambio de las urls. Este script lo guardas en un archivo .js y luego lo cargas en las páginas que necesites así todo el proceso se realiza desde el lado del cliente. Tal vez pueda servirte esta solución como alternativa a realizarlo en php. Yo hice algo parecido una vez y fue con jquery.
__________________
Te sirvió mi ayuda? +1 ;D
Andy Aquino - @aquiandres
  #5 (permalink)  
Antiguo 12/07/2011, 12:53
Avatar de Z3R0N3  
Fecha de Ingreso: junio-2010
Ubicación: En algún lugar de la mancha de cuyo nombre no quiero acordarme...
Mensajes: 73
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Buscar y Buscar dentro de Cadenas

Cita:
Iniciado por andres_aquino Ver Mensaje
Así como dijo ZoroRoronoa, podrías usar javascript para poder extraer todos los onclick y dentro de estas, usar las expresiones regulares de javascript y realizar el cambio de las urls. Este script lo guardas en un archivo .js y luego lo cargas en las páginas que necesites así todo el proceso se realiza desde el lado del cliente. Tal vez pueda servirte esta solución como alternativa a realizarlo en php. Yo hice algo parecido una vez y fue con jquery.

Gracias por vuestras respuestas.

En lo que decís puede que lleveís razón, el asunto está en que JS no lo domino tanto como quisiera, y que lo necesito en PHP ya que luego voy a generar un archivo comprimido con el documento HTML y los archivos que están referenciados en las URL's que intento capturar de "onclick".

Por ello necesito continuar el código desde PHP. Javascript ya se está encargando de enviar por completo el archivo HTML para que luego PHP lo analice desde el servidor y envíe al cliente el archivo.zip con todos los documentos dentro.


¿Alguna idea?
  #6 (permalink)  
Antiguo 12/07/2011, 19:05
Avatar de Z3R0N3  
Fecha de Ingreso: junio-2010
Ubicación: En algún lugar de la mancha de cuyo nombre no quiero acordarme...
Mensajes: 73
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Buscar y Buscar dentro de Cadenas

Hola chicos al final lo conseguí !!

Bueno más bien me echaron un cable unos compañeros de otro foro paralelo pero he conseguido dar con la solución y os la pongo a ustedes para quien le pueda servir.


Al parecer el problema estaba en la función tieneUrls(); y al parecer desde la expresión regular "preg_match_all" ya puedo realizar todo el proceso desde una sola línea.

Os pego aquí el código de la función:

Código:
function tieneUrls($cuerpo){
	preg_match_all('/onclick=\"[^[(]+\((?:\'|\"){1}(?=https?|ftp)([^\']+)(?=\',\s?)/i',stripslashes($cuerpo), $result, PREG_PATTERN_ORDER);
	return $result[1];
}

Luego tan simplemente haría lo siguiente:

Código:
		if((stristr($contenidorecibido, 'onclick') == true) && (stristr($contenidorecibido, ');"') == true)) {
			$extraerUrls = tieneUrls($contenidorecibido);
			print_r($extraerUrls);
		}

Y listo!! todos las URL's listadas bajo una variable de tipo array();


El resultado sería el siguiente:

Código:
Array
(
    [0] => http://www.laweb.es/Documentos/webflv1308325486171.flv
    [1] => http://www.laweb.es/Documentos/webflv1308325540890.flv
    [2] => http://www.laweb.es/Documentos/ARCHIVOS/d0ab59150_folder.png
    [3] => http://www.laweb.es/Documentos/ARCHIVOS/d0ab59150_mensaje 128px.png
)

Bueno y ahí está.


Gracias amigos por vuestro interés y ayuda con el seguimiento del post. Se puede dar por solucionado y espero que le sirva a otros usuarios.

Salu2
  #7 (permalink)  
Antiguo 13/07/2011, 10:17
Avatar de andres_aquino  
Fecha de Ingreso: septiembre-2010
Ubicación: $("#place").html("FDW");
Mensajes: 138
Antigüedad: 13 años, 7 meses
Puntos: 24
Respuesta: Buscar y Buscar dentro de Cadenas

Excelente solución! Con las expresiones regulares se pueden hacer muchas cosas interesantes, lástima que yo no sea tan amigo de estas, sino, de seguro que te daba una mano mucho antes pero en fin, muy bueno y directo a la galería de códigos... gracias por compartirlo!
__________________
Te sirvió mi ayuda? +1 ;D
Andy Aquino - @aquiandres

Etiquetas: cadenas, html, variables
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 09:46.