web-dev-qa-db-fra.com

PHP using preg_replace: erreur "le délimiteur ne doit pas être alphanumérique ou antislash"

J'essaie de prendre une chaîne de texte comme ceci:

$string = "This (1) is (2) my (3) example (4) text";

Dans tous les cas où il y a un entier positif à l'intérieur des parenthèses, j'aimerais le remplacer par simplement l'entier lui-même.

Le code que j'utilise maintenant est:

$result = preg_replace("\((\d+)\)", "$0", $string);

Mais je continue à recevoir un

Le délimiteur ne doit pas être alphanumérique ni antislash.

Attention

Des pensées? Je sais qu'il y a d'autres questions ici qui répondent de la sorte à la question, mais ma connaissance de la regex ne suffit pas pour passer à cet exemple. 

30
Christopher

Tu es presque là. Vous utilisez:

$result = preg_replace("((\d+))", "$0", $string);
  • La regex que vous spécifiez comme 1er argument À la famille preg_* de la fonction Doit être délimitée par une paire de délimiteurs Étant donné que vous n'utilisez pas de délimiteurs, vous obtenez cette erreur.
  • ( et ) sont des méta-caractères dans une expression rationnelle, ce qui signifie qu'ils ont une signification spéciale .. Puisque vous voulez faire correspondre une parenthèse ouverte .__ avec une parenthèse fermée, vous devez les échapper à l'aide d'un \ . Tout ce qui suit \ est traité littéralement
  • Vous pouvez capturer le nombre entier Correctement en utilisant \d+. Mais le nombre capturé Sera dans $1 et non pas $0. $0 aura la correspondance entière, c'est-à-dire entier entre parenthèses.

Si vous faites tous les changements ci-dessus, vous obtiendrez:

$result = preg_replace("#\((\d+)\)#", "$1", $string);
42
codaddict

1) Vous devez avoir un délimiteur, le / fonctionne bien.

2) Vous devez échapper aux caractères ( et ) pour éviter de penser qu'il s'agit d'un autre groupe.

3) De plus, les variables de remplacement commencent ici à 1 et non à 0 (0 contient la correspondance textuelle COMPLETE, qui inclurait les parenthèses).

$result = preg_replace("/\((\d+)\)/", "\\1", $string);

Quelque chose comme ça devrait marcher. Si vous avez d'autres questions, consultez la documentation preg_replace() de PHP - c'est vraiment bon.

5
animuson

Vérifiez la documentation - vous devez utiliser un délimiteur avant et après votre modèle: "/\((\d+)\)/"

Vous voudrez également échapper aux parenthèses externes ci-dessus car elles sont littérales et non un groupe de correspondance imbriqué.

Voir: Page de manuel de preg_replace

2
pix0r

Le délimiteur ne doit pas être alphanumérique ni antislash.,

essayez de taper vos paramètres dans "/ .... /" comme indiqué ci-dessous. Sinon, le code sera généré >>> Le séparateur ne doit pas être alphanumérique ni antislash.

$yourString='hi there, good friend';
$dividorString='there';
$someSstring=preg_replace("/$dividorString/",'', $yourString);

echo($someSstring);

// hi, good friend

...__ a travaillé pour moi.

0
Darian Harrison

Essayer:

<?php
$string = "This (1) is (2) my (3) example (4) text";
$output = preg_replace('/\((\d)\)/i', '$1', $string);
echo $output;
?>

Les caractères entre parenthèses sont des caractères spéciaux dans une expression régulière. Vous devez leur échapper pour les utiliser.

0
Atli