Bağlantıları URL'leri dönüştürmek için iyi bir regex gerek ama yalnız mevcut bağlantıları bırakın

6 Cevap php

Ben kullanıcı gönderilen içeriğin bir yük var. Bu HTML ve URL'ler içerebilir. Bazıları olacak <a> 's zaten (kullanıcı iyi olup olmadığını) ancak bazen kullanıcıların tembel ve sadece www.something.com yazın ya da en iyisi http://www.something.com.

Ben URL'leri yakalamak ancak bir çift tırnak veya '>' ya hemen sağındaki olanları görmezden iyi bir regex bulamıyorum. Herkes bir tane var?

6 Cevap

Jan Goyvaerts, RegexBuddy yaratıcısı vardır written a response Jeff vardı sorunları giderir ve güzel bir çözüm sağlar Jeff Atwood bloga.

\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

Hemen yanındaki "veya> meydana eşleşmeleri görmezden için, regex başlamasından (?<![">]) ekleyebilir, böylece olsun

(?<![">])\b(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&@#/%=~_|$?!:,.]*[A-Z0-9+&@#/%=~_|$]

Bu www ile başlayan tam adreslerini (http:// ...) ve adresleri maç olacak. veya ftp. - Eğer ars.userfriendly.org gibi adresleri ile şans bitti ...

Ben özgün yanıt bulunan Regex için hafif bir değişiklik yaptı:

(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]

Hangi daha fazla alt etki alanları için izin verir, ve aynı zamanda etiketleri üzerinde daha tam bir kontrol çalışır. PHP'nin preg bu uygulamak için kullanabilirsiniz, değiştirin:

$convertedText = preg_replace( '@(?<![.*">])\b(?:(?:https?|ftp|file)://|[a-z]\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]@i', '<a href="\0" target="_blank">\0</a>', $originalText );

Ben preg_replace için sınırlayıcı olarak kullanmak üzere, regex gelen @ kaldırıldı, unutmayın. Bu @ zaten bir URL'de kullanılabilir olacağını oldukça nadirdir.

Açıkçası, rel = "nofollow" vb değiştirme metnini değiştirebilir ve target = "_blank" kaldırmak, ya da ekleyebilir

Umut olur.

Bu konu tepeler kadar eski olduğunu, ama benim kendi sorun üzerinde çalışırken ben rastladım: Bu isimli, bağlantılardan herhangi adresler dönüştürmek, ancak tek başına herhangi bir çapa etiketleri içinde zaten bırakıyorum. Bir süre sonra, bu dışarı attı budur:

(?!(?!.*?<a)[^<]*<\/a>)(?:(?:https?|ftp|file)://|www\.|ftp\.)[-A-Z0-9+&#/%=~_|$?!:,.]*[A-Z0-9+&#/%=~_|$]

Aşağıdaki girişi ile:

http://www.google.com
http://google.com
www.google.com

<p>http://www.google.com<p>

this is a normal sentence. let's hope it's ok.

<a href="http://www.google.com">www.google.com</a>

Bu bir preg_replace bir çıktısı:

<a href="http://www.google.com" rel="nofollow">http://www.google.com</a>
<a href="http://google.com" rel="nofollow">http://google.com</a>
<a href="www.google.com" rel="nofollow">www.google.com</a>

<p><a href="http://www.google.com" rel="nofollow">http://www.google.com</a><p>

this is a normal sentence. let's hope it's ok.

<a href="http://www.google.com">www.google.com</a>

Sadece Birine biraz zaman kazanmak için geri katkıda bulunmak istedim.

The Problem With URLs Jeff Bu sitede kullanılan çözüm için bkz.

Utanmaz fiş: Sen (regular expression replace a word by a link) ilham için buradan bakabilirsiniz.

Soru zaten bir bağlantı olmadığı sürece, belli bir link ile bazı sözcüğü değiştirmek istedi. Yani var sorun daha az ya da aynı şeydir.

Tüm ihtiyacınız (sözcüğü yerine) bir URL ile eşleşen bir regex olduğunu. Bir URL (isteğe bağlı) "http://", "ftp://" veya "mailto:" ile başlar ve sürece hiçbir boşluk karakterleri olduğu gibi sürer: basit varsayım bu gibi olurdu , satır sonları, etiket parantez veya tırnak).

Önde, uzun regex sakının. Vaka-insensitively uygulayın.

(href\s*=\s*['"]?)?((?:http://|ftp://|mailto:)?[^.,<>"'\s\r\n\t]+(?:\.(?![.<>"'\s\r\n])[^.,!<>"'\s\r\n\t]+)+)

Uyardı - Bu da technically geçersiz URL'ler maç olacak, ve bir URL olarak things.formatted.like.this tanıyacaktır. Çok duyarsız ise sizin verilere bağlıdır. Eğer yanlış pozitif döndürür örnekler varsa ben regex ince ayar yapabilirsiniz.

Regex iki maç grup üretecek. Grup 2, URL büyük olasılıkla eşleşti şeyi içerecektir. Grup 1 boş bir dize veya 'href="' içerecektir ya. Bu maç Varolan bir bağlantının inside a href parametresini meydana geldiğini bir göstergesi olarak kullanabilirsiniz ve bu dokunuş yapmak zorunda değilsiniz biridir.

Bu most of the time (kullanıcı tarafından sağlanan verileri ile, emin olamaz) sizin için doğru olanı yapar onaylamak sonra, ben başka bir soru onu önerildiği gibi, iki adımda dinlenme yapabilirsiniz:

  1. Her URL etrafında bir bağlantı yapmak bu will bir bağlantı var şeyler için çift iç içe <a> etiketleri üretmek (! unless maç grup 1 şey) var zaten.
  2. Içteki birini kaldırarak, yanlış iç içe <a> etiketleri tara

Mevcut olanları atlamak için sadece bir göz-arkasında kullanın - böyle bir şey olmazdı yani, (?<!href=") düzenli ifadenin başına ekleyin:

/(?<!href=")http://\S*/

Açıkçası bu URL'lerin finding her türlü için komple bir çözüm değil, ama bu mevcut olanlarla uğraşmaktansa sorunu çözmek gerekir.