2010-09-15 6 views
3
preg_replace('/http:///ftp:///', 'https://', $value); 

http:// et ftp:// l'intérieur $value doit être remplacé par https://modificateur Erreur inconnue '/' en PHP

Ce code donne l'erreur:

preg_replace() [function.preg-replace]: Unknown modifier '/' 

Qu'est-ce qu'un vrai regex pour cette tâche?

Répondre

6

Essayez d'utiliser un séparateur différent, disons #:

preg_replace('#http://|ftp://#', 'https://', $value); 

ou (moins recommandé) échapper à toutes les occurrences du délimiteur dans la regex:

preg_replace('/http:\/\/|ftp:\/\//', 'https://', $value); 

vous aussi recherchez le modèle http:///ftp:// ce qui n'a vraiment pas beaucoup de sens, peut-être voulez-vous dire http://|ftp://.

Vous pouvez faire votre regex plus court:

preg_replace('#(?:http|ftp)#', 'https', $value); 

Comprendre l'erreur:Unknown modifier '/'

Dans votre regex '/http:///ftp:///', le premier / est considéré comme délimiteur de départ et le / après la : est considéré comme le délimiteur de fin. Nous savons maintenant que nous pouvons fournir un modificateur à la regex pour modifier son comportement par défaut. Certains de ces modificateurs sont:

  • i: faire le cas correspondant insensible
  • m: plusieurs lignes de recherche

Mais que PHP voit après le délimiteur de fermeture est un autre / et tente d'interpréter comme un modificateur mais échoue, entraînant l'erreur.

preg_replace renvoie la chaîne modifiée.

$value = 'http://foo.com'; 
$value = preg_replace('#http://|ftp://#', 'https://', $value); 
// $value is now https://foo.com 
+0

premier ne fonctionne pas – James

+0

-vous la collecte valeur de retour de 'preg_replace' comme je l'ai montré ci-dessus? – codaddict

1

Utilisez un autre caractère de délimitation, par exemple '#'.

preg_replace('#/http://|ftp://#', 'https://', $value); 

Et ne confondez pas/et |

1
preg_replace('!(http://|ftp://)!', 'https://', $value); 

longue histoire: Regexp doit être enfermé dans délimiteurs, et celles-ci doivent être uniques dans l'ensemble regexp. Si vous voulez utiliser /, alors les/-s restants dans l'expression rationnelle doivent être échappés. Cela rend cependant la syntaxe un peu moche. Heureusement, vous pouvez utiliser n'importe quel caractère comme délimiteur. ! fonctionne bien, tout comme les autres personnages.

Le reste de l'expression rationnelle énumère juste deux options, dont l'une sera remplacée par le deuxième paramètre.

+0

pouvez-vous expliquer cette regex? – James

1
preg_replace('|http:\/\/ftp:\/\/', 'https://|', $value); 
1

Utilisez ce lieu:

preg_replace('-(http|ftp)://-', 'https://', $value); 

Ou

preg_replace('/(http|ftp):\/\//', 'https://', $value); 
Questions connexes