strpos (PHP) de « \\\\\\\\ r \\\\\\\\ n » caractères
-
27-10-2019 - |
Question
J'ai un texte dans la base de données MySQL qui est demandé dans « $ description » et je voudrais savoir si \\\\\\\\r\\\\\\\\n
est présente dans la description. Donc je suis:
if(strpos($description, "\\\\\\\\r\\\\\\\\n") !== FALSE) {
echo "String is here.";
} else {
echo "String not found.";
}
mais cette commande affiche toujours "String not found." et je crois qu'il ya une mauvaise fuite dans la chaîne recherchée (de \\\\\\\\r\\\\\\\\n
). Comment puis-je strpos par \\\\\\\\r\\\\\\\\n
? De plus, je finirais probablement str_replace-ment tous les \\\\\\\\r\\\\\\\\n
avec \r\n
que quelqu'un a fait une mauvaise fuite des fonctions et des données sont arrivées comme \\\\\\\\r\\\\\\\\n
au lieu de \r\n
, donc un str_replace fait face au même problème aussi. Je pourrais utiliser l'aide sur l'une de ces tâches (str_pos, str_replace).
Merci beaucoup.
La solution
Le caractère regrettable de la détection du caractère anti-slash est parce qu'il est aussi le caractère universel échapper. Et de mettre un anti-slash dans une chaîne, vous devez échapper - avec elle-même
C'est-à-dire si vous voulez détecter un à barre oblique inverse, votre code pourrait ressembler à ceci
if(strpos($description, '\\' ) !== FALSE)
Par conséquent, si vous voulez détecter huit, antislashs consécutifs, votre chaîne à match contre aura besoin que deux -. Seize
if(strpos($description, '\\\\\\\\\\\\\\\\' ) !== FALSE)
Par conséquent, votre dernier match à l'aide strpos()
devrait ressembler à ceci
if(strpos($description, '\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\n' ) !== FALSE)
aussi remarqué que je suis passé à guillemets simples. En effet, \n
et \r
sont interprétés à l'intérieur de littéraux de chaîne entre guillemets.
Vous pouvez aussi le faire avec des expressions régulières, ce qui va être un peu plus souple et puissant
if ( preg_match( "/\\x5C{8}[rn]/", $description ) )
EDIT
Pour la recherche-remplacement, je suggère quelque chose comme ça. Comme je l'ai mentionné plus haut, l'expression régulière va être plus puissant - celui-ci correspondra \r
ou \n
(et pas seulement quand ils sont adjacents) avec toute quantité d'antislash précédentes, non seulement 8 d'entre eux
$description = preg_replace( "/\\x5C+([rn])/", '\\\${1}', $description );
Autres conseils
if(strpos($description, '\\\\\\\\\\\\\\\\r\\\\\\\\\\\\\\\\n') !== FALSE) {
echo "String is here.";
} else {
echo "String not found.";
}
<?php
$in = "abc";
if(preg_match('/\n|\r/',$in)){
echo 'found';
}else{
echo 'not found';
}