私はこのテキストを持っています:
_$string = "this is my friend's website http://example.com I think it is coll";
_
リンクを別の変数に抽出するにはどうすればよいですか?
特にpreg_match()
を使用して正規表現を使用する必要がありますが、方法がわかりません。
おそらく最も安全な方法は、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
)。
私は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);
}
URLにはかなり 複雑な定義 があります—最初にキャプチャするものを決定する必要があります。 http://
およびhttps://
で始まるものをキャプチャする簡単な例は次のとおりです。
preg_match_all('!https?://\S+!', $string, $matches);
$all_urls = $matches[0];
これは非常に基本的であり、無効なURLをキャプチャする可能性があることに注意してください。 [〜#〜] posix [〜#〜] および PHP正規表現 を追いかけることをお勧めします。
私のために働いたコードは(特にあなたの$ 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 />';
}
他の人にも役立つことを願っています。
このようにできます。
<?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
preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);
これは、すべてではなく、多くの場合に機能する簡単な方法です。すべての一致は$ matchesに入れられます。これはアンカー要素のリンク(<a href = "" ...)をカバーしていませんが、あなたの例でもそうではないことに注意してください。
これを試してリンクを見つけ、リンクを修正することができます(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
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
$var, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $var)
{
print($var."<br>");
}
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;
}
}
この正規表現は私にとってはうまく機能し、すべての種類の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