Buscar y Buscar dentro de Cadenas

Iniciado por Z3R0N3, Julio 12, 2011, 02:28:41 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Julio 12, 2011, 02:28:41 PM Ultima modificación: Marzo 27, 2014, 05:57:56 PM por Expermicid
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: php
$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: php


// 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: php
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.
Daria todo lo que sé por la mitad de lo que ignoro

Yo creo que tu problema esta en la funcion. Hize una misma función pero modifique la Expresion Regular.

Código: php
<?php


function tieneUrls($cuerpo){

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

return $result[1];
}

$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.
";
print_r(tieneUrls($cadenaHTML));


?>


Salida:
Código: php

[yoya@Fedora ~]$ php /var/www/html/a.php
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
)
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

~ Yoya ~ tio... te quiero!! xDD

Cómo pudiste verlo tan fácilmente?¿

Se nota que no entregué aún las tareas del taller de PHP jajajaj gracias amigo me salvaste la vida :D


Voy a ponerme a buscar un buen manual de expresiones regulares... creo que ando bastante perdido y me encantaría aprenderlas son utilísimas.


Thank's :P
Daria todo lo que sé por la mitad de lo que ignoro

Pasa que tengo tiempo parseando datos, algo de experiencia tendre XD.

No pasa nada compañero, cualquier duda con Expresiones Regulares o PHP, aquí estamos para ayudarte.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

Que buenísimo... jeje, supongo que ya se puede dar como solucionado :D

Gracias MOD.
Daria todo lo que sé por la mitad de lo que ignoro