2010-10-01 8 views
0

J'ai essayé de convertir directement une expression "eregi" en une expression "preg_match".Mon expression PHP preg_match ne fonctionne pas

$ACCEPT_CHARS = "a-z0-9_~#&;=./?+-"; 
$msg = preg_match("/ (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)/i", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg); 

Cependant, je reçois:

Warning: preg_match() [function.preg-match]: Unknown modifier '&' in /var/www/comm.borealisbbi.org/includes/functions_parse.php on line 282 

Qu'est-ce que je fait de mal?

La ligne originale était:

$msg = eregi(" (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg); 

Répondre

2

C'est à cause du slash dans votre avant regex /. Puisque vous les avez utilisés comme délimiteurs, le moteur de regex s'attend à ce que l'expression soit terminée après le /. Vous pouvez y échapper, ou utiliser un séparateur différent:

$msg = preg_replace("~ (http|https|ftp|gopher|news)://([$ACCEPT_CHARS]+)~i", "<a href=\"\\1://\\2\" target=\"_blank\">\\1://\\2</a>", $msg); 

Cela dit ...

  • Je ne comprends pas pourquoi vous utilisez preg_match() ici. Je pense que vous vouliez dire preg_replace()?

  • Votre regex n'est pas très robuste. Si vous validez l'URL, vous pourriez utilisateur filter_var() à la place:

    filter_var('example.com', FILTER_VALIDATE_URL); 
    
Questions connexes