Regex di PHP per filtrare gli URL da domini specifici da utilizzare in un plug-in vBulletin

Sto cercando di mettere insieme un plug-in per vBulletin per filtrare i link ai siti di filesharing. Ma, come sono sicuro che tu senta spesso, sono un newb di php e tanto less regex.

Fondamentalmente, sto cercando di mettere insieme un'espressione regolare e utilizzare un preg_replace per trovare qualsiasi URL proveniente da questi domini e sostituire l'integer link con un messaggio che non sono consentiti. Vorrei che trovasse il collegamento sia che fosse hyperlinked, pubblicato come text normale, o racchiuso tra i tag bb [CODE].

Per quanto riguarda la regex, avrei bisogno di trovare URL con il seguente, penso:

  1. Inizia con http o un tag di ancoraggio. Credo che gli URL nei tag [CODE] possano essere elaborati come gli URL di text normale e va bene se la sostituzione finisce nel tag [CODE] in seguito.
  2. Potrebbe contenere un numero qualsiasi di caratteri prima del dominio / parola
  3. Ha il dominio da qualche parte nel mezzo
  4. Potrebbe contenere un numero qualsiasi di caratteri dopo il dominio
  5. Termina con un numero di estensioni come (html | htm | rar | zip | 001) o in un tag di ancoraggio di chiusura.

Ho la sensazione che siano i numbers 2 e 4 a farmi inciampare (se non molto di più). Ho trovato una domanda simile qui e ho cercato di distinguere il codice un po '(anche se non l'ho capito veramente). Ora ho questo che pensavo potesse funzionare, ma non lo è:

<?php $filterthese = arrays('domain1', 'domain2', 'domain3'); $replacement = 'LINKS HAVE BEEN FILTERED MESSAGE'; $regex = arrays('!^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']); ?> 

Ho la sensazione di essere fuori di testa qui, e ammetto che non capisco perfettamente php figuriamoci regex. Sono aperto a qualsiasi suggerimento su come farlo meglio, su come farlo funzionare o su collegamenti a RTM (anche se ho letto un po 'e ho intenzione di continuare).

Grazie.

Puoi usare parse_url sugli URL e guardare nell'hashmap che restituisce. Ciò ti consente di filtrare domini o controllo ancora più fine.

Penso che tu possa evitare l'overhead di questo usando la function built-in filter_var .

È ansible utilizzare questa function da PHP 5.2.0.

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

Hmm, la mia prima ipotesi: hai messo $filterthese direttamente all'interno di una string con quotatura singola. Quelle virgolette singole non consentono la sostituzione variabile. Inoltre, $filterthese è una matrix, che deve essere prima aggiunta:

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

Forse sono lontano, perché non so nulla dei plugin di vBulletin e della loro magia incorporata, ma quei punti mi sembrano meritevoli di un controllo.

Modifica: OK, nel ricontrollare la fonte fornita, penso che la row delle espressioni regolari dovrebbe essere così:

 $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]: )(["\']?[^>]*>)?!';