web-dev-qa-db-ja.com

PHPのテキストからURLを抽出します

私はこのテキストを持っています:

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

リンクを別の変数に抽出するにはどうすればよいですか?

特にpreg_match()を使用して正規表現を使用する必要がありますが、方法がわかりません。

39
ahmed

おそらく最も安全な方法は、WordPressのコードスニペットを使用することです。最新のもの(現在3.1.1)をダウンロードし、wp-includes/formatting.phpを参照してください。 paramのプレーンテキストを持ち、書式設定された文字列を返すmake_clickableという名前の関数があります。 URLを抽出するためのコードを取得できます。それはかなり複雑です。

この1行の正規表現が役立つ場合があります。

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

ただし、この正規表現では、不正な形式のURL(例:http://google:ha.ckers.org)。

参照: StackOverflowの自動リンク動作を模倣する方法

45
Nobu

私はNobuが言ったようにWordpressを使ってやろうとしましたが、他のWordPress関数に多くの依存関係があるため、代わりに preg_match_all() にNobuの正規表現を使用することを選択しました= preg_replace_callback() ;を使用して関数に変換し、テキスト内のすべてのリンクをクリック可能なリンクに置き換える関数。 匿名関数 を使用PHP 5.3が必要です。または、代わりに通常の関数を使用するようにコードを書き換えることができます。

<?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);
}
15
Mikael Roos

URLにはかなり 複雑な定義 があります—最初にキャプチャするものを決定する必要があります。 http://およびhttps://で始まるものをキャプチャする簡単な例は次のとおりです。

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

これは非常に基本的であり、無効なURLをキャプチャする可能性があることに注意してください。 [〜#〜] posix [〜#〜] および PHP正規表現 を追いかけることをお勧めします。

12
soulmerge

URLを抽出するテキストがユーザーが送信したものであり、結果をリンクとしてどこにでも表示する場合は、 XSS脆弱性 、最も顕著な「javascript: "プロトコルURLだけでなく、 不正な形式のURL これにより、正規表現や表示ブラウザがJavascript URLとして実行される可能性があります。少なくとも、「http」、「https」、または「ftp」で始まるURLのみを受け入れる必要があります。

また、Jeffによる ブログエントリ もあり、URLの抽出に関するその他の問題について説明しています。

8

私のために働いたコードは(特にあなたの$ stringにいくつかのリンクがある場合)です:

$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 />';
}

他の人にも役立つことを願っています。

5
Kai Noack

このようにできます。

<?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
5
preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);

これは、すべてではなく、多くの場合に機能する簡単な方法です。すべての一致は$ matchesに入れられます。これはアンカー要素のリンク(<a href = "" ...)をカバーしていませんが、あなたの例でもそうではないことに注意してください。

4
runfalk

これを試してリンクを見つけ、リンクを修正することができます(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://example.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";

}

ここを参照してください: http://php.net/manual/en/function.preg-match.php

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

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

foreach($matches as $var)
{    
    print($var."<br>");
}
2
user923477
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; 
    }
}
0
karolkarp

この正規表現は私にとってはうまく機能し、すべての種類の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
?>

ここで見つけることができる多くのURLでチェック http://www.rubular.com/r/bFHobduQ3n

0