preg_match_all - regex php




Extrae las URL del texto en PHP (8)

El código que funcionó para mí (especialmente si tiene varios enlaces en su $ string) es:

$string = "this is my friend's website http://example.com I think it is cool, but this is cooler http://www.memelpower.com :)";
$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $string, $matches);
$urls = $matches[0];
// go over all links
foreach($urls as $url) 
{
    echo $url.'<br />';
}

Espero que ayude a otros también.

Tengo este texto:

$string = "this is my friend's website http://example.com I think it is coll";

¿Cómo puedo extraer el enlace a otra variable?

Sé que debería ser mediante el uso de expresión regular, especialmente preg_match() pero no sé cómo?


Este Regex funciona muy bien para mí y lo he comprobado con todos los tipos de URL,

<?php
$string = "Thisregexfindurlhttp://www.rubular.com/r/bFHobduQ3n mixedwithstring";
preg_match_all('/(https?|ssh|ftp):\/\/[^\s"]+/', $string, $url);
$all_url = $url[0]; // Returns Array Of all Found URL's
$one_url = $url[0][0]; // Gives the First URL in Array of URL's
?>

Comprobado con muchas URL puede encontrar aquí http://www.rubular.com/r/bFHobduQ3n


Podrías hacer esto ...

<?php
$string = "this is my friend's website http://example.com I think it is coll";
echo explode(' ',strstr($string,'http://'))[0]; //"prints" http://example.com

Probablemente la forma más segura es usar fragmentos de código de WordPress. Descargue la última (actualmente 3.1.1) y vea wp-includes / formatting.php. Hay una función llamada make_clickable que tiene texto simple para param y devuelve una cadena formateada. Puede obtener códigos para extraer URL. Aunque es bastante complejo.

Esta línea recta de una línea podría ser útil.

preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match);

Pero esta expresión regular todavía no puede eliminar algunas URL mal formadas (por ejemplo, http://google:ha.ckers.org ).

Ver también: Cómo imitar el comportamiento de enlace automático de


Si el texto del que extraes las URL es enviado por el usuario y vas a mostrar el resultado como enlaces en cualquier lugar, debes ser MUY cuidadoso para evitar las vulnerabilidades XSS , especialmente las URL del protocolo "javascript:", pero también malformadas. URLs que pueden engañar a su expresión regular y / o al navegador de visualización para que se ejecuten como URL Javascript. Como mínimo, debe aceptar solo URL que comiencen con "http", "https" o "ftp".

También hay una entrada de blog de Jeff donde describe algunos otros problemas con la extracción de URL.


Traté de hacer lo que dijo Nobu, usando Wordpress, pero con muchas dependencias de otras funciones de WordPress, opté por usar la expresión regular de Nobu para preg_match_all() y la convertí en una función, usando preg_replace_callback() ; una función que ahora reemplaza todos los enlaces en un texto con enlaces clicables. Utiliza funciones anónimas, por lo que necesitará PHP 5.3 o puede reescribir el código para usar una función normal.

<?php 

/**
 * Make clickable links from URLs in text.
 */

function make_clickable($text) {
    $regex = '#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#';
    return preg_replace_callback($regex, function ($matches) {
        return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";
    }, $text);
}

preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);

Esta es una manera fácil que funcionaría para muchos casos, no para todos. Todos los partidos se ponen en $ matches. Tenga en cuenta que esto no cubre los enlaces en los elementos de anclaje (<a href = "" ...), pero tampoco en su ejemplo.


public function find_links($post_content){
    $reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    // Check if there is a url in the text
    if(preg_match_all($reg_exUrl, $post_content, $urls)) {
        // make the urls hyper links,
        foreach($urls[0] as $url){
            $post_content = str_replace($url, '<a href="'.$url.'" rel="nofollow"> LINK </a>', $post_content);
        }
        //var_dump($post_content);die(); //uncomment to see result
        //return text with hyper links
        return $post_content;
    } else {
        // if no urls in the text just return the text
        return $post_content; 
    }
}






regex