DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   Dodavanje rel="nofollow" linkovima (http://www.devprotalk.com/showthread.php?t=8000)

Nemanja Avramović 22. 10. 2009. 20:46

Dodavanje rel="nofollow" linkovima
 
Imam html koji dolazi od korisnika (komentari) i trebalo bi da se doda rel="nofollow" svim linkovima koji se nađu u tom HTML-u. Našao sam ovo:

PHP kôd:

function addNoFollow($html)
{
    
$str stripslashes($html);
    
$preg "/<[\s]*a[\s]*href=[\s]*[\"\']?([\w.-]*)[\"\']?[^>]*>(.*?)<\/a>/i";
    
preg_match_all($preg$str$match);
    foreach (
$match[1] as $key=>$val) {
        
$pattern[] = '/'.preg_quote($match[0][$key],'/').'/';
        
$replace[] = "<a href='$val' rel='nofollow'>{$match[2][$key]}</a>";
    }
    return 
preg_replace($pattern$replace$str);


I to dodaje linkovima rel="nofollow", ali mi zezne URL-ove u linkovima, odnosno ostavi samo "http" u href atributu. Pretpostavljam da je loš regex pa ako neko može da baci pogled, bio bih mu zahvalan.

Radio sam print_r($match); posle preg_match_all(), i uopšte ne match-uje URL sa ovakvim regex-om.

bOkIcA 22. 10. 2009. 21:07

PHP kôd:

$preg "/<a.*href=[\"\'](.*)[\"\'].*>(.*?)<\/a>/i"


Nemanja Avramović 22. 10. 2009. 21:42

Radi, hvala!

srdjevic 23. 10. 2009. 09:04

Razmišljanja dokonog programera... :)
 
Vrlo opasan preg je ovo, hvata samo poslednji link u redu....

PHP kôd:

addNoFollow('<a href="http://domen1.com/">domen1</a><a href="http://domen2.com/">domen2</a>') == '<a href='http://domen2.com/' rel='nofollow'>domen2</a>' 

Ja sam to kontao rešiti drugojačije, baš razmišljah da uvedem ovako nešto na jedan sajt, pa eto taman da modifikujem malo ovo, i meni će trebati uskoro... :1019:

Ovo rešenje traži samo ceo otvarajući A i prvo izbacuje postojeći rel atribut (čak i ako nema navodnike, jer se i to guta), i onda dodaje naš rel="nofollow" na kraj:

PHP kôd:

function addNoFollow($str) { 
    
$search $replacements = array();
    
$preg '/<a([^>]*)>/i';
    
preg_match_all($preg$str$match);
    foreach ( 
$match[0] as $key => $val ) {
        if ( !
preg_match('/\shref=/i'$val) ) continue;
        
$search[] = $val;
        
$r preg_replace('/\srel=[\"\']?\w+[\"\']?/i'''$val);
        
$r substr($r0, -1) . ' rel="nofollow">';
        
$replacements[] = $r;
    }
    return 
str_replace($search$replacements$str);


Mislim da sam ovim pokrio većinu slučajeva. Testirano sa:

PHP kôd:

print_r(addNoFollow('<a href="http://domen1.com/" rel="something">domen1</a><a href="http://domen2.com/">domen2</a><a href="http://domen3.com/" rel=something>domen3</a>')); 


srdjevic 23. 10. 2009. 10:12

inače, mislim da bi Bokicino rešenje radilo za više linkova u istom redu kada bi se dodao modifier "U" za ungreedy... :1007:

bOkIcA 23. 10. 2009. 11:48

^ tako je, zahvaljujem

Znaci fali modifier /U tj /iU.
Samo sam ispravio bio regex, nisam proveravao.

bOkIcA 23. 10. 2009. 12:05

Jos jedna ispravka, sad sam proverio i trebalo bi da radi kako treba. :)

PHP kôd:

$preg "/<a.*href=[\"\'](.*)[\"\'].*>(.*)<\/a>/iU"


krcko 23. 10. 2009. 21:35

i ja sam skoro radio to isto, pa evo moje verzije koja radi malo drugacije (ima dodatnu opciju da excludeuje neke domene, tako npr mozete lako da provucete ceo text kroz nju i samo na linkovima koje ne vode do vasih sajtova stavite nofollow):
PHP kôd:

class NoFollow {
    
    private static 
$exceptions;
    
    public static function 
add($text$exceptions = array()) {
        
        
self::$exceptions = array();
        
        foreach (
$exceptions as $exception) {
            if (!
$exception) continue;
            if (
$exception[0] == '.') {
                
$exception '([^.]+\.)?' preg_quote(substr($exception1), '/');
            } else {
                
$exception preg_quote($exception'/');
            }
            
self::$exceptions[] = '/^(s?ftp|https?):\/\/' $exception '/i';
        }
        
        return 
preg_replace_callback('/<a\s+([^>]*)>/i', array(__CLASS__'filter'), $text);
    }
    
    private static function 
filter($matches) {
        
        
$attr = array();

        if (
preg_match_all('/([a-z0-9_:]+)\s*=\s*"([^"]*)"/i'$matches[1], $attribs)) {
            foreach (
$attribs[0] as $i => $attrib) {
                
$attr[$attribs[1][$i]] = $attribs[2][$i];
            }
        }

        if (isset(
$attr['href'])) {

            
$external true;

            foreach (
self::$exceptions as $exception) {
                if (
preg_match($exception$attr['href'])) {
                    
$external false;
                    break;
                }
            }

            if (
$external) {
                if (isset(
$attr['rel'])) {
                    if (
strpos($attr['rel'], 'nofollow') === false) {
                        
$attr['rel'] = 'nofollow ' $attr['rel'];
                    }
                } else {
                    
$attr['rel'] = 'nofollow';
                }
            } elseif (isset(
$attr['rel']) and strpos($attr['rel'], 'nofollow') !== false) {
                
$attr['rel'] = trim(str_replace('nofollow'''$attr['rel']));
                if (empty(
$attr['rel'])) {
                    unset(
$attr['rel']);
                }
            }
        }

        
$link '<a';
        
        foreach (
$attr as $name => $value) {
            
$link .= $name=\"$value\"";
        }

        return 
$link '>';
    }


koristi se jednostavno:
PHP kôd:

$text NoFollow::add($text);  // dodaje rel="nofollow" na sve linkove
$text NoFollow::add($text, array('www.google.com'));  // dodaje rel="nofollow" na sve linkove osim www.google.com (ali dodaje na npr code.google.com)
$text NoFollow::add($text, array('.google.com'));  // dodaje rel="nofollow" na sve linkove osim google.com (sa bilo kojim poddomenom, ili bez poddomena) 



Vreme je GMT +2. Trenutno vreme je 20:56.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.