html regex - Extrae las URL del texto en PHP




online preg_match_all (10)

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?


Answers

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; 
    }
}

preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                $var, &$matches);

$matches = $matches[1];
$list = array();

foreach($matches as $var)
{    
    print($var."<br>");
}

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

Las URL tienen una definición bastante compleja : primero debe decidir qué desea capturar. Un ejemplo simple de captura de cualquier cosa que empiece por http:// y https:// podría ser:

preg_match_all('!https?://\S+!', $string, $matches);
$all_urls = $matches[0];

Tenga en cuenta que esto es muy básico y podría capturar URL inválidas. Recomiendo ponerse al día con POSIX expresiones regulares de POSIX y PHP para cosas más complejas.


Puede intentar esto para encontrar el enlace y revisar el enlace (agregue el enlace href).

$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";

// The Text you want to filter for urls
$text = "The text you want to filter goes here. http://note.taable.com";

if(preg_match($reg_exUrl, $text, $url)) {

       echo preg_replace($reg_exUrl, "<a href="{$url[0]}">{$url[0]}</a> ", $text);

} else {

       echo "No url in the text";

}

refiérase aquí: http://php.net/manual/en/function.preg-match.php socialnews


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);
}

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.


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.


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.


A continuación se muestra la función para cambiar la URL sin volver a cargar la página. Solo soporta HTML5

  function ChangeUrl(page, url) {
        if (typeof (history.pushState) != "undefined") {
            var obj = {Page: page, Url: url};
            history.pushState(obj, obj.Page, obj.Url);
        } else {
            window.location.href = "homePage";
            // alert("Browser does not support HTML5.");
        }
    }

  ChangeUrl('Page1', 'homePage');




php html regex