PHP metin adresler ayıklamak

8 Cevap php

Ben bu metni var:

$string = "this is my friend's website http://example.com I think it is coll";

Nasıl başka bir değişken içine linki ayıklamak?

Ben özellikle preg_match() düzenli ifade ile olması gerektiğini biliyorum ama nasıl bilmiyorum?

Teşekkürler

8 Cevap

Muhtemelen en güvenli yolu WordPress kod parçacıkları kullanıyor. Son bir (şu anda 3.1.1) indirin ve wp-includes/formatting.php bakın. Param ve dize biçimlendirilmiş iadeler için düz metin olan make_clickable adında bir işlevi var. URL'leri ayıklanması için kodlarını yakalayabilir. Bu rağmen oldukça kompleks bulunuyor.

Bu bir satır regex yardımcı olabilir.

preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match);

Ama bu regex hala bazı hatalı biçimlendirilmiş URL'lerin (örn. http://google:ha.ckers.org) kaldıramazsınız.

See also: How to mimic StackOverflow Auto-Link Behavior

Protokol: metin kullanıcı gönderilen ve her yerde bağlantılar olarak sonucu görüntülemek için gidiyoruz gelen URL'leri ayıklamak ederseniz, XSS vulnerabilities en belirgin "javascript" önlemek için çok, çok dikkatli olmak zorunda URL'ler, aynı zamanda malformed URLs sizin regexpi ve / veya Javascript URL'ler olarak bunları yürütme içine görüntüleyen tarayıcı kandırmak olabilir. En azından, size "http", "https" veya "ftp" ile başlayan sadece URL'leri kabul etmelidir.

O açılan URL'ler ile bazı diğer sorunları açıklanır Jeff tarafından bir blog entry da bulunuyor.

,) (Şimdi tüm bağlantıları yerini bir işlev Nobu söylediğim gibi Wordpress kullanarak yapmaya çalıştım, ancak diğer WordPress fonksiyonları için çok bağımlılıkları yerine preg_match_all için Nobu'nın düzenli ifade () kullanmak için seçti ve preg_replace_callback kullanarak, bir işlev çevirdi tıklanabilir bağlantılar ile bir metinde. Kullandığı anonomous functions böylece PHP5.3 gerekir ya da bunun yerine sıradan bir işlevi kullanmak için kodu yeniden olabilir.

<?php 
/**
 * Make clickable links from URLs in text.
 */
function make_clickable($text) {
  return preg_replace_callback(
    '#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', 
    create_function(
      '$matches',
      'return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";'
    ),
    $text
  );
}

Eğer ilk yakalamak istediğiniz ne karar vermelisiniz - URL'leri oldukça complex definition var. Http:// ve https:// ile başlayan bir şey yakalayan basit bir örnek olabilir:

preg_match_all('!https?://[\S]+!', $string, $matches);
$all_urls = $matches[0];

Bu çok temel ve geçersiz adresler yakalamak olabilir unutmayın. Ben daha karmaşık şeyler için posix- ve php regular expressions yetişmeye öneriyoruz.

Ben bu yüzden sana kafamın tipi kapalı yazımları veremiyoruz PHP bilmiyorum, ama ben normal ifadeler kullanarak öneririm. İşte PHP düzenli ifadeler kullanarak bir bağlantı: http://www.regular-expressions.info/php.html. Ayrıca, burada e-posta düzenli ifadeler için bir link: http://www.regular-expressions.info/email.html

İyi şanslar.

preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);

Bu, tüm vakaların bir sürü için değil çalışmak istiyorum kolay bir yoludur. Tüm karşılaşmalar $ maçta konur. Bu çapa elemanları bağlantıları (

Böyle yapabilirsin ..

<?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

(Eğer $ dize çeşitli bağlantılar var özellikle) benim için çalıştı kodu:

$string = "this is my friend's website http://example.com I think it is cool, but this is cooler http://www.echteinfach.tv :)";
$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 />';
}

O da başkalarına yardımcı olur umarım.