44 votes

Suppression des guillemets au début et à la fin d'une chaîne de caractères en PHP

J'ai des cordes comme celles-ci :

"my value1" => my value1
"my Value2" => my Value2
myvalue3 => myvalue3 

Je dois me débarrasser de " (guillemets doubles) à la fin et au début, s'ils existent, mais s'il y a ce type de caractère à l'intérieur de la chaîne, il doit être laissé là. Exemple :

"my " value1" => my " value1

Comment puis-je faire cela en PHP - existe-t-il une fonction pour cela ou dois-je le coder moi-même ?

1 votes

Que faire en cas de ""Hello " World"" ?

0 votes

""Hello " World"" => ""Hello " World""

0 votes

Je ne sais pas si je rate quelque chose, quand je vois toutes les expressions régulières complexes Mais preg_replace('/(^"|"$)/', '', '""Hello " World""') renvoie à "Hello " World" . Ou même '/^"|"$/' comme le modèle fonctionne aussi.

103voto

La réponse littérale serait

trim($string,'"'); // double quotes
trim($string,'\'"'); // any combination of ' and "

Elle supprime tous les guillemets avant et arrière d'une chaîne de caractères.

Si vous devez supprimer strictement la première et la dernière citation au cas où elles existeraient, il pourrait s'agir d'une expression régulière comme celle-ci

preg_replace('~^"?(.*?)"?$~', '$1', $string); // double quotes
preg_replace('~^[\'"]?(.*?)[\'"]?$~', '$1', $string); // either ' or " whichever is found

Si vous avez besoin de supprimer seulement dans le cas où le guillemet avant et le guillemet arrière sont strictement appariés, alors utilisez la fonction de Réponse de Steve Chambers

Cependant, si votre objectif est de lire une valeur à partir d'un fichier CSV , fgetcsv est la seule option correcte. Elle s'occupera de tous les cas limites, en dépouillant également les boîtiers de valeur.

1 votes

Bonne fonction en effet, mais l'OP veut laisser le " au centre et ne l'enlever qu'au début et à la fin...

2 votes

Si le deuxième caractère est également '"', ou l'avant-dernier, il sera également supprimé. Si ces caractères sont significatifs, l'élagage tombe. Cela dépend légèrement des données réelles. Voir la réponse de l'utilisateur783322.

0 votes

En clair : "trim() supprime les guillemets consécutifs du début ou de la fin. Cependant, nous ne voulons supprimer que le premier et le dernier guillemet. Cela signifie que cette réponse ne devrait pas être acceptable.

20voto

Steve Chambers Points 3303

J'avais un besoin similaire et j'ai écrit une fonction qui supprime les guillemets simples ou doubles avant et arrière d'une chaîne de caractères :

/**
 * Remove the first and last quote from a quoted string of text
 *
 * @param mixed $text
 */
function stripQuotes($text) {
  return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
} 

Cela produira les résultats énumérés ci-dessous :

Input text         Output text
--------------------------------
No quotes       => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each'   => "One of each'
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'

Démonstration de Regex (montrant ce qui est mis en correspondance/capturé) : https://regex101.com/r/3otW7H/1

7voto

user783322 Points 439

trim supprimera toutes les instances du caractère du début et de la fin s'il correspond au modèle que vous fournissez, donc :

$myValue => '"Hi"""""';
$myValue=trim($myValue, '"');

Deviendra :

$myValue => 'Hi'.

Voici un moyen de ne supprimer le premier et le dernier caractère que s'ils correspondent :

$output=stripslashes(trim($myValue));

// if the first char is a " then remove it
if(strpos($output,'"')===0)$output=substr($output,1,(strlen($output)-1));

// if the last char is a " then remove it
if(strripos($output,'"')===(strlen($output)-1))$output=substr($output,0,-1);

4voto

Même si ce fil aurait dû être supprimé depuis longtemps, je n'ai pas pu m'empêcher de répondre par ce que j'appellerais la réponse la plus simple de toutes. J'ai remarqué que ce fil de discussion a réapparu le 17, donc je ne me sens pas aussi mal à ce sujet :)

En utilisant les échantillons fournis par Steve Chambers ;

echo preg_replace('/(^[\"\']|[\"\']$)/', '', $input);

Sortie ci-dessous ;

Input text         Output text
--------------------------------
No quotes       => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each'   => One of each
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'

Cette méthode ne supprime que la première et la dernière citation, elle ne répète pas pour supprimer le contenu supplémentaire et ne se préoccupe pas des extrémités correspondantes.

1voto

Mark Bradley Points 314

Il s'agit d'un ancien article, mais pour tenir compte des chaînes de caractères à plusieurs octets, il existe au moins deux voies possibles à suivre. Je suppose que la suppression des guillemets est effectuée parce que le guillemet est considéré comme une variable de programme / INI et est donc SOIT "quelque chose" soit "quelque chose d'autre" mais PAS "des guillemets mixtes". De plus, tout ce qui se trouve entre les guillemets doit être conservé intact.
Itinéraire 1 - utilisation d'une Regex

function sq_re($i) {
    return preg_replace( '#^(\'|")(.*)\1$#isu', '$2', $i );
}

Cela utilise \1 pour correspondre au même type de citation que celui du début. Le modificateur u le rend compatible avec l'UTF8 (d'accord, il ne supporte pas complètement le multi-octet).

Parcours 2 - utilisation des fonctions mb_*

function sq($i) {
    $f = mb_substr($i, 0, 1);
    $l = mb_substr($i, -1);
    if (($f == $l) && (($f == '"') || ($f == '\'')) ) $i = mb_substr($i, 1, mb_strlen( $i ) - 2);
    return $i;
}

0 votes

Je n'obtiens pas le #^ au début du motif, le # à la fin, ainsi que le modificateur i. N'est-ce pas ^(\'|")(.*) \1 $su tout ce qui est nécessaire pour répondre à la question ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X