Bonjour,

J'aimerais savoir comment faire pour refuser des liens dans un post ?

<form method="post">
    <textarea name="text"></textarea>
</form>

Si la personne met un lien dans name=text alors il est redirigé sur error.php?chat=link

Une idée ?

16 réponses


PhiSyX
Réponse acceptée

Yop. Ceci remplace tous les liens, avec ou sans protocols...

Exemple:

$re = '(?(DEFINE)
    (?<scheme> ((https?|ftp)\:\/\/)? )
    (?<user_pass> ([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)? )
    (?<dns> ([a-z0-9-.]*)\.([a-z]{2,4}) )
    (?<port> (\:[0-9]{2,5})? )
    (?<path> (\/([a-z0-9+\$_-]\.?)+)*\/? )
    (?<queryString> (\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)? )
    (?<anchor> (\#[a-z_.-][a-z0-9+\$_.-]*)? )
)
(?&scheme)(?&user_pass)(?&dns)(?&port)(?&path)(?&queryString)(?&anchor)';

$text = nl2br(htmlspecialchars('Hello, visit https://www.domain.com
We are not partners of http://microsoft.com/ :)
Download source from: ftp://new.sourceforge.com
<hr>Hackernews
1.  Const and Optimization in C (nullprogram.com)
66 points by adamnemecek 2 hours ago | hide | 14 comments
2.  Don\'t add your 2 cents (sivers.org)
280 points by dhruvkar 6 hours ago | hide | 94 comments
3.  9th Circuit: It’s a crime to visit a website after being told not to visit it (washingtonpost.com)
59 points by walterbell 4 hours ago | hide | 33 comments
4.  The Raspberry Pi Has Revolutionized Emulation (codinghorror.com)
288 points by dwaxe 10 hours ago | hide | 79 comments
5.  Verizon \'agrees to $5B Yahoo deal\' (bbc.co.uk)
317 points by kartikkumar 13 hours ago | hide | 211 comments

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.3/jquery.min.js"></script>
<script>
(function () {
   var text = \'Coucou\'
   console.log(text + \' tvvmb\')
   window.alert(\'ok\')
})()
</script>'));

echo preg_replace('#' . $re . '#x', '<span style="font-weight: bold;" title="Le lien supprimé est le suivant: $0">&lt; delete link &gt;</span>', $text);

Par contre comme tu peux le voir, ça remplace aussi les méthodes javascripts (dans l'exemple console.log, window.alert), c'est ça l'inconvénient de ne pas capturer automatiquement les protocols. :c

PhiSyX
Réponse acceptée

Qu'est-ce que tu ne comprends pas?
La regex?
J'ai crée des groupes (?<nom_de_group> regle) pour qu'on puisse mieux lire la règle mais si ça te dérange, tu peux la mettre sur une seule ligne... Ca revient au même.

Le groupe (?<scheme>): cette regle intervient dans le cas où une URL à un protocol.

Correpond à: http://local.dev/
Cette règle n'est pas obligatoire.

Le groupe (?<user_pass>): cette regle intervient dans le cas où une URL est de ce type.

Correpond à: http://`username:password@`local.dev/
Cette règle n'est pas obligatoire.

Le groupe (?<dns>): cette regle correspond à l'host de l'URL.

Correpond à: http://`local.dev Correpond à: http://username:password@local.dev`
Obligatoire.
Amélioration: y ajouter une règle pour les adresses ip's ;-)

Le groupe (?<port>): cette regle intervient dans le cas où une URL à un port.

Correpond à: local.dev:8080
Cette règle n'est pas obligatoire.

Le groupe (?<path>): cette regle intervient dans le cas où une URL à un chemin.

Correpond à: local.dev/cctvvmb.html
Cette règle n'est pas obligatoire.

Le groupe (?<queryString>): cette regle intervient dans le cas où une URL à des queryString's aka des $_GET.

Correpond à: local.dev/cctvvmb.html?foo=bar
Cette règle n'est pas obligatoire.

Le groupe (?<anchor>): cette regle intervient dans le cas où une URL à une ancre (ou hash comme tu veux).

Correpond à: local.dev/cctvvmb.html#id_2
Cette règle n'est pas obligatoire.

Voilà.

Salut !

Dans ta page de traitement tu as juste a vérifier si il y a un http:// dans le $_POST['text']

Cobryn
Auteur

Salut, Comment faire ça :s ?
Sachant que je souhaite bloqué TOUT les lien, HTTP HTTPS sans HTTP ni HTTPS mais avec une extension :S

Sachant que si $_POST['text'] vaut:

salut moi c'est pierre et ça c'est mon site: salutpierre.fr http://salutcpierre.fr/

Il faut qui replace par <deleted link> dans le meilleur des cas une idée ?N

Bonjour. Utilise la fonction preg_match_all avec un masque adapté du style

preg_match_all('#([http][s]?[\:\/\/]?[www\.]?)#i',$match,$text)

Ne copie pas ce masque hein ^^ c'est un exemple ;)

Cobryn
Auteur

Salut,

J'ai réussi à faire ça, (ça fonctionne) mais cela ne me detecte pas quand il n'y a pas de http ou de https :/

function linkify($text) {
    return preg_replace('#\b(http|ftp)(s)?\://([^ \s\t\r\n]+?)([\s\t\r\n])+#smui', '<a href="$1$2://$3">$1$2://$3</a>$4', $text);
}

echo nl2br(linkify('
    Hello, visit https://www.domain.com
    We are not partners of http://microsoft.com/ :)
    Download source from: ftp://new.sourceforge.com
'));

==

Hello, visit < deleted link >We are not partners of < deleted link >:)
Download source from: < deleted link >

J'utilise jamais preg_replace, j'utilise tout le temps preg_match_all, mais en ajoutant les "www." dans ton masque?
Mais là du coup tu fais l'inverse, tu tente de remplacer le texte par un lien?

function replace_links($text)
{
 if(preg_match_all('#(http(s)?\:\/\/(www\.)?|(www\.)|(ftp(s)?\:\/\/))(.*)(\.[a-zA-Z]+)#i',$text,$matchs))
 {
  foreach($matchs as $match)
  {
   $text = str_replace($match,'',$text);
   return $text;
  }
 }
}

Un truc dans le genre ;)

Cobryn
Auteur

Bonjour,

Ouaip comme ça c'est plutôt bon, mais je bloque encore, (difficulté avec le regex).
Il bloque les HTTP HTTPS WWW mais si je met juste domain.com il ne bloque pas :c Tu aurais une piste ?

Salut,

peut-être en incluant "tout ce qui finit par un point suivi de 2 ou 3 lettres" ?

'...\.[a-z]{2,3}$#i'
'#(http(s)?\:\/\/(www\.)?|(www\.)|(ftp(s)?\:\/\/))(.*)(\.[a-zA-Z]+)(\.[a-z]{2,3})$#i'
Cobryn
Auteur

SLK:

Le code me retire TOUT le texte :/

Ah bon ? xD

Mince...

Cobryn
Auteur

PhiSyX:

y'aurait moyens de détailler un peu et de simplifier ?
je comprend presque rien a rien la oO

Cobryn
Auteur

Super !

Je te remercie vraiment, je garde ça très précieusement :)
Pile ce qu'il me fallait :)

(PS: C'est pour un chat, les joueurs ne peuvent pas envoyé de lien =) )

Généralement, pour un Chat:
On a des robots qui s'occupent d'expulser automatiquement les utilisateurs qui postent des liens avec protocols (PRECIS) et des opérateurs/modérateurs humains qui eux décident d'expulser ou non des utilisateurs pouvant envoyer un lien sans protocols.
Car effectivement, comme dit plus haut, il se peut que le texte remplacé ne soit pas forcément un lien.

Exemple:

User1: "console.log ta variable test pour voir" => console.log sera remplacé.
User2: "Salut tout le monde.ca va bien les gens ? :)" => monde.ca sera remplacé.

Cobryn
Auteur

Je vais faire comme ça pour le début, et j'aviserais par la suite