Metin girişi bir URL'ye çapa etiketi eklemek için nasıl

5 Cevap php

Ben bir açıklama alanına kullanıcı girilen metni alıp URL türü ifade için kontrol edebilmek istiyorum, ve eğer varsa comment görüntülendiğinde, (url) bir çapa etiketi ekleyebilirsiniz.

Ben sunucu tarafında PHP kullanarak, ve Javascript (jQuery ile) istemci, bu yüzden görüntülenmeden önce sağa kadar URL kontrol etmek için beklemek gerekir ki? Ya da veritabanında yerleştirmeden önce çapa etiketi eklemek?

bu yüzden

<textarea id="comment">check out blahblah.com or www.thisthing.co.uk or http://checkthis.us/</textarea>

olur

<div id="commentDisplay">check out <a href="blahblah.com">blahblah.com</a> or <a href="www.thisthing.co.uk">www.thisthing.co.uk</a> or <a href="http://checkthis.us/">http://checkthis.us/</a></div>

5 Cevap

İlk olarak, bir istek. Veritabanına veri yazmadan önce bunu yapmayın. Bunun yerine, son kullanıcıya veri görüntülemeden önce bunu. Bu, tüm karışıklığa aşağı kesecek ve size gelecekte daha fazla esneklik sağlayacaktır.

Bir örnek found online aşağıdaki gibidir:

$text = preg_replace('@(https?://([-\w\.]+)+(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)?)@', '<a href="$1">$1</a>', $text);

Ve bir çok daha kapsamlı bir daringfireball.net:

/**
 * Replace links in text with html links
 *
 * @param  string $text
 * @return string
 */
function auto_link_text($text)
{
   $pattern  = '#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#';
   $callback = create_function('$matches', '
       $url       = array_shift($matches);
       $url_parts = parse_url($url);

       $text = parse_url($url, PHP_URL_HOST) . parse_url($url, PHP_URL_PATH);
       $text = preg_replace("/^www./", "", $text);

       $last = -(strlen(strrchr($text, "/"))) + 1;
       if ($last < 0) {
           $text = substr($text, 0, $last) . "&hellip;";
       }

       return sprintf(\'<a rel="nowfollow" href="%s">%s</a>\', $url, $text);
   ');

   return preg_replace_callback($pattern, $callback, $text);
}

O (hak kazanmak için http (s) gerekmez) bir etki alanı ne olduğu hakkında daha hoşgörülü olduğunu bu yüzden Jonathan Sampson'ın regex seçeneği uyarlanmıştır.

function hyperlinksAnchored($text) {
    return preg_replace('@(http)?(s)?(://)?(([-\w]+\.)+([^\s]+)+[^,.\s])@', '<a href="http$2://$4">$1$2$3$4</a>', $text);
}

Bu URL'ler (ve başarılı bir dönem ya da virgül sondaki bırakır) için çalışır:

http://www.google.com/
https://www.google.com/.
www.google.com
www.google.com.
www.google.com/test
google.com
google.com,
google.com/test
123.com/test
www.123.com.au
ex-ample.com
http://ex-ample.com
http://ex-ample.com/test-url_chars.php?param1=val1.
http://ex-ample.com/test-url_chars?param1=value1&param2=val+with%20spaces

O birisi yardımcı olur umarım.

Şahsen ben doğru göstermeden önce JS ile işaretlemek istiyorum, kullanıcının Yorum kendinizi düzenleyerek daha profesyonel ve sürdürülebilir görünüyor.

Ben doğrusu sunucu tarafında bu yapardı. Javascript bir "gecikme" vardır; o tüm HTML DOM ağacı yüklenir ve webbrowser gösterilmiştir yalnızca çalışır. Böylece bir almak (kısa olsa da) URL tanınan ve ayrıştırılır süre önce. Olabilir Müvekkilinin halen içeriğini karşı karşıya iken bağlantılar anında yerini görebilirsiniz. Bu yol açabilecek "wtf?" istemci tarafında deneyimler. Bu günümüzde çok hızlı advertisting / Spam / spyware ile ilgili olduğunu. Mümkün olduğunca fazla kaçınmalısınız. Yerine (Onchange, onfocus, vb, onclick) kullanıcı kontrollü olaylar sırasında sadece bunu, içerik onload değiştirmek için JS kullanmayın. Kaydetmek için önceki veya ekran içeriğini değiştirmek için sunucu tarafı dil kullanın.

Yani, sadece metin ayrıştırır (veya regex kullanır), düz metin olarak URL tabanlı fullworthy bağlantılar oluşturmak için bir PHP komut dosyası arayın. Sen bir sürü bulabilirsiniz here. İyi şanslar.

Rafineri Markd en ondalık, yüzdeler, sayısal tarihleri ​​(2001/03/10), üç nokta ve IP adresleri bağlantıları önlemek için cevap:

    function addLinks($text) {
    return preg_replace('@(http)?(s)?(://)?(([a-zA-Z])([-\w]+\.)+([^\s\.]+[^\s]*)+[^,.\s])@', '<a target="ref" href="http$2://$4">$1$2$3$4</a>', $text);
}

Için çalışır:

http://www.google.com/
https://www.google.com/.
www.google.com
www.google.com.
www.google.com/test
google.com
google.com,
google.com/test
www.123.com.au
ex-ample.com
http://ex-ample.com
http://ex-ample.com/test-url_chars.php?param1=val1.
http://ex-ample.com/test-url_chars?param1=value1&param2=val+with%20spaces

Does not work for:

123.com/test (numeric domains without 'www')
Keep it up press of popular opinion........keep the average (ellipsis)
Rising 3.8% to 3.94 million from 3.79 million (percentages and decimals)
Edited by Andrew Brooke - 07.08.2013 19:57 (dd.mm.yyyy dates)
10.1.1.1 (IP Addresses)