6

$content がテキストエリアのコンテンツであるとしましょう

/*Convert the http/https to link */
     $content = preg_replace('!((https://|http://)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="$1">$1</a> ', nl2br($_POST['helpcontent'])." ");
/*Convert the www. to link prepending http://*/
     $content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." ");

これはリンクには問題なく機能していましたが、画像がテキスト内にあるとマークアップが壊れていることに気付きました...

私は今このようにしようとしています:

$content = preg_replace('!\s((https?://|http://)+[a-z0-9_./?=&-]+)!i', ' <a href="$1">$1</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$1">$1</a> ', $content." ");

画像は尊重されますが、問題は http:// または https:// 形式の URL が現在変換されないことです..:

google.com -> 変換されません (予想どおり)

www.google.com -> コンバージョン率が高い

http://google.com -> 変換されません (予期しない)

https://google.com -> 変換されません (予期しない)

私は何が欠けていますか?

-編集-

現在のほとんど機能するソリューション:

$content = preg_replace('!(\s|^)((https?://)+[a-z0-9_./?=&-]+)!i', ' <a href="$2" target="_blank">$2</a> ', nl2br($_POST['content'])." ");
$content = preg_replace('!(\s|^)((www\.)+[a-z0-9_./?=&-]+)!i', '<a target="_blank" href="http://$2"  target="_blank">$2</a> ', $content." ");

ここで重要なのは、これが入力の場合:

www.funcook.com http://www.funcook.com https://www.funcook.com funcook.com http://funcook.com https://funcook.com

必要なすべての URL (name.domain を除くすべて) は期待どおりに変換されますが、これは出力です

www.funcook.com http://www.funcook.com https://www.funcook.com ; funcook.com http://funcook.com https://funcook.com

に注意してください。が挿入されましたが、その理由は何ですか?

4

5 に答える 5

8

これを試して:

preg_replace('!(\s|^)((https?://|www\.)+[a-z0-9_./?=&-]+)!i', ' <a href="$2">$2</a> ',$text);

http:// または www で始まるリンクを取得します。

于 2012-07-17T19:32:00.167 に答える
2

100%ではできません。などのリンクがない場合もありますstackoverflow.comのでwww.

これらのリンクのみをターゲットにしている場合:

!(www\.\S+)!i

あなたにとって十分にうまくいくはずです。


編集:あなたの最新の質問については、なぜ http リンクが変換されず、https が変換されるのかについて、あなたの最初のパターンは のみを検索するhttps://http://.、そうではありません。次のように置き換えて単純化します。

(https://|http://\.)

(https?://)

これはsオプションになります。

于 2012-07-17T19:30:20.587 に答える
1

I had similar problem. Here is function which helped me. Maybe it will fit your needs to:

function clHost($Address) { 
   $parseUrl = parse_url(trim($Address)); 
   return  str_replace ("www.","",trim(trim($parseUrl[host] ? $parseUrl[host].$parseUrl[path] :  $parseUrl[path]),'/'));
}

This function will return domain without protocol and "www", so you can add them yourself later.

For example:

$url = "http://www.". clHost($link);

I did it like that, because I couldn't find good regexp.

于 2012-07-24T04:12:50.333 に答える
1

ハイパーリンクを追加するもう 1 つの方法は、リンクを解析するテキストを取得し、それを配列に分解することです。次に、foreach (非常に高速な関数 - http://www.phpbench.com/ ) を使用してループし、http://、https://、www. で始まるか、.com/ で終わるものをすべて変更します。 org/etc をリンクにします。

私はおそらく次のようなことを考えています:

$userTextArray = explode(" ",$userText);
foreach( $userTextArray as &$word){
    //if statements to test if if it starts with www. or ends with .com or whatever else
    //change $word so that it is a link
}

foreach ステートメントの $userText の前に「&」があるため、変更が配列に反映されます。配列を文字列に戻すだけで、準備完了です。

これは私の頭では理にかなっています...しかし、これがあなたが探しているものであると100%確信しているわけではありません

于 2012-07-17T19:38:57.013 に答える
0

\s((https?://|www.)+[a-z0-9_./?=&-]+)

問題は、開始\ sが一致をスペースで開始するように強制しているため、その開始スペースがない場合、一致は失敗することです。reg expは(\ sなしで)問題ありませんが、画像の置き換えを回避するには、画像の一致を回避するために何かを追加する必要があります。

画像が純粋なhtmlの場合は、次を使用します。 (?<!src=")((https?://|www.)+[a-z0-9_./?=&-]+)

それはそれを無視するために、urlの前にsrc="を探します。

別のマークアップを使用する場合は、教えてください。画像を回避する別の方法を見つけようとします。

于 2012-07-30T13:37:10.763 に答える