Bir vBulletin kullanılmak üzere belirli etki adresler filtreleme için PHP regex plug-in

4 Cevap php

Ben dosya paylaşım sitelerine bağlantılar süzmek için birlikte Powered için bir plug-in koymak için çalışıyorum. Ben sık sık duymak eminim ama, ben yalnız Regexes izin php bir newb değilim.

Temelde, ben birlikte bir regex koymak ve bu etki vardır ve onlar izin verilmez bir mesaj ile tüm bağlantısını değiştirmek herhangi adresler bulmak için bir preg_replace kullanmaya çalışıyorum. Ben düz metin olarak yayınlanan veya [KOD] bb etiketleri içine, o köprü olsun bağlantıyı bulmak isterdim.

Regex gelince, ben aşağıdaki ile URL'LER bulmak için gerekir, ben düşünüyorum:

  1. Http veya bir çapa etiketi ile başlar. I [KODU] etiketleri URLS düz metin URL'ler gibi aynı işlenmiş olabilir ve yedek sonra [KOD] etiketi içinde biter o gayet iyi olduğuna inanıyorum.
  2. Domain / kelimenin önce herhangi bir herhangi bir sayıda karakter içerebilir
  3. Orta alanı bir yere sahiptir
  4. Etki sonra herhangi bir karakter herhangi bir sayıda içerebilir
  5. Gibi uzantıları bir dizi ile sona erer (| htm | html rar | zip | 001) veya bir kapanış etiketi çapa.

Ben (daha fazla değil ise) en sayılar 2 ve 4 beni takılmadan bir his var. Burada benzer bir soru bulundu ve kodu biraz (ben gerçekten bunu anlamadı bile) ayrı almaya çalıştı. Ben şimdi işe yarayabileceğini düşündüm ki bu var, ama öyle değil:

<?php  
$filterthese = array('domain1', 'domain2', 'domain3');  
$replacement = 'LINKS HAVE BEEN FILTERED MESSAGE';  
$regex = array('!^http+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*(html|htm|rar|zip|001)$!',  
'!^<a+([a-z0-9-]+\.)*$filterthese+([a-z0-9-]+\.)*</a>$!');
$this->post['message'] = preg_replace($regex, $replacement, $this->post['message']);
?>

Ben burada yolu kapalı baz Ben bir his var, ve ben tamamen php yalnız Regexes izin anlamıyorum itiraf. Ben sadece o iş yapmak için nasıl, bu daha iyi yapmak konusunda herhangi Önerilere açığım, ya da (ben biraz okudum ve ben devam edeceğim gerçi) bağlantıları RTFM için.

Teşekkürler.

4 Cevap

Sen URL'ler üzerinde parse_url kullanmak ve döndürür HashMap içine bakabilirsiniz. Yani etki ya da ince taneli kontrolü için filtre sağlar.

Sana filter_var yerleşik fonksiyonunu kullanarak bu yükü önleyebilirsiniz düşünüyorum.

PHP 5.2.0 'dan beri bu özelliği kullanabilirsiniz.

$good_url = filter_var( filter_var( $raw_url, FILTER_SANITIZE_URL), FILTER_VALIDATE_URL);

Hmm, benim ilk tahminim: Bir tek tırnaklı dizge içinde doğrudan $filterthese koydu. Bu tek tırnak değişken değişimi için izin vermez. Ayrıca, $filterthese İlk katıldı gereken bir dizidir:

var $filterthese = implode("|", $filterthese);

Belki vBulletin eklentileri ve gömülü sihirli hakkında hiçbir şey bilmiyorum çünkü ben, yolu kapalı değilim, ama puan benim için bir onay değer gibi görünüyor.

Edit: Tamam, yeniden kontrol senin sağlanan kaynak, ben regexp çizgi böyle okumak gerektiğini düşünüyorum:

$regex = '!(?#
  possible "a" tag [start]: )(<a[^>]+href=["\']?)?(?#
  offending link:           )https?://(?#
    possible subdomains:    )(([a-z0-9-]+\.)*\.)?(?#
    domains to block:       )('.implode("|", $filterthese).')(?#
    possible path:          )(/[^ "\'>]*)?(?#
  possible "a" tag [end]:   )(["\']?[^>]*>)?!';

Iki adımda içine sorununuzu yıkmak. First (her nasılsa) yazı bulunan tüm URL'leri bulmak. İkincisi, kara listeye URL'leri karşı her bir URL ile eşleşen. Eğer var olduğunu varsayarsak:

$blacklist = array(
    'domain1.com',
    'domain2.net',
    'domain3.co.uk'
);

Kod bu satırlar boyunca bir şey gidebilir:

foreach ( $urls as $url )
{
  foreach ( $blacklist as $ban )
  {
    $ban = preg_quote( $ban ); // domain1.com becomes domain1\.com
    if ( preg_match( '@^https?://([^\.]+\.)*' . $ban . '(/|$)@', $url ) )
    // reg-exp becomes ^https?://([^\.]+\.)*domain1\.com(/|$)
    // should match http://domain1.com
    // should match http://domain1.com/
    // should match https://domain1.com
    // should match http://www.domain1.com
    // should match http://www.download.domain1.com
    // should match http://www.download.server1.domain1.com
    // should not match match http://another-domain1.com
    // should not match match http://domain1.company.com
    // should not match match http://domain1.com.company.com
    {
      // banned url
    }
  }
}