2016-06-16 15 views
0

私は現在、次の形式でリンクテキストやURLをキャプチャするために、次の正規表現を持っているlinkifyする:それは、私がURLをlinkifyし、その後、別の表現を追加すると正規表現は、URLの

[Link](http://link.com)

\[(.+)]\(((https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,}))\)

を上記の形式でそれらを混乱させます。

両方のケースを処理する特異な正規表現はありますか?

http://link.com - ><a href="http://link.com" target="_blank">http://link.com</a>

[Link](http://link.com) - ><a href="http://link.com" target="_blank">Link</a>

PHP:

$string = preg_replace('/\[(.+)]\(((https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,}))\)/', '<a href="$2" target="_blank">$1</a>', $string); 
+0

必須[「あなたは正規表現でHTMLを解析することはできません」](HTTP: //stackoverflow.com/a/1732454/1270789)link。 –

+1

@ KenY-Nは質問を再読... – HamZa

+0

@frosty私は間違いなく1つの正規表現でこれをやろうとしません。 – HamZa

答えて

2

URL構文があまりにも(非常に複雑になる可能性があるため、文字列にURLを識別するための本当の方法はありませんはっきりと複雑になる)。つまり、[...](...)のようなものは、()の間のコンテンツが本当にURLであるかどうかを検証することなく、リンクを表していることを受け入れる必要があります。 (後でいつでもparse_urlを使用できますが、有効なURLは除外されている可能性があります)

あなたが探していることは次のとおりです。

$result = preg_replace('~\[([^]]*)]\([^)]*\)~', '<a href="$2" target="_blank">$1</a>', $str); 

// If you want to hunt lonely urls in your text, you can always search 
// after extracting text nodes with XPath and a naive pattern like this: 

$dom = new DOMDocument; 
$dom->loadHTML($result); 

$xp = new DOMXPath($dom); 
$textNodes = $xp->query('//text()'); 

foreach($textNodes as $textNode) { 
    $textNode->nodeValue = preg_replace('~[hw](?:(?<=\bh)ttps?://|(?<=\bw)ww\.)\S+~i', '<a href="$0" target="_blank">$0</a>~', $textNode->nodeValue); 
} 

$result = $dom->saveHTML(); 

注:あなたが絶対URLを確認したい場合は、より良い結果のために、あなたは、preg_replace_callbackと同じパターンを使用するまで試合の最後の文字を削除することができますparse_urlが動作し、置換を実行しますが、あまり効果がありません。

+1

@ハムザ:私はそれを行うには貧弱な方法を追加しました。 –

+0

私のコードは[...](...)のために働いていましたが...私が意味したのは、孤独なURLをpreg_replaceで実行すると、[...](...) 。私もあなたの仕事を得ることができません。 – frosty

+0

@frosty:答えを編集しました。この最後のパターンは、問題を避けるためにXPathで抽出した後にテキストノードにのみ適用する必要があります。 –

0

たぶん、このヘルプあなたビット:マークダウン構文で

/** 
* Linkify Function 
* @param $tweet 
* @return mixed 
*/ 
function linkify_tweet($tweet) 
{ 
//Convert urls to <a> links 
$tweet = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a href=\"mailto:[email protected]?subject=WEB $1\">$1</a>", $tweet); 

//Convert hashtags to twitter searches in <a> links 
$tweet = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a href=\"#\">#$1</a>", $tweet); 

//Convert attags to twitter profiles in <a> links 
$tweet = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"mailto:[email protected]?subject=MSG @$1\" class=\"userlink\">@$1</a>", $tweet); 

return $tweet; 
} 
0

まず契約。その後、処理されなかったプレーンなリンクをキャッチします。同様のregexpを使うことができますが、parethesisはありません。あなたは(HTMLが一致しません)空白の制限内のURLのように見えるすべてのものを交換したい場合、これは行います:

\s(https?:\/\/(?:www\.|(?!www))[^\s.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})