2010-06-11 6 views
17

Je souhaite désinfecter une chaîne dans une URL, c'est donc ce dont j'ai besoin.Expression régulière Sanitize (PHP)

  1. Tout doit être supprimé à l'exception des caractères alphanumériques et des espaces et des tirets.
  2. Les espaces doivent être convertis en tirets.

Par exemple.

This, is the URL! 

doit retourner

this-is-the-url 
+0

nous ne pouvons rien voir, s'il vous plaît formater votre code correctement. – jigfox

+0

Salut jens, je suis clueless sur le code et c'est ce que j'ai besoin d'aide pour. La seule chose que je sais est qu'il devrait utiliser preg_replace() mais je ne sais pas ce que l'expression régulière devrait être. Merci –

Répondre

40
function slug($z){ 
    $z = strtolower($z); 
    $z = preg_replace('/[^a-z0-9 -]+/', '', $z); 
    $z = str_replace(' ', '-', $z); 
    return trim($z, '-'); 
} 
+0

merci beaucoup .. Juste un edit .. Je veux enlever les tirets de début et de fin avant de renvoyer $ z juste au cas où ils existent. –

+0

@ atif089: ajouté – SilentGhost

+0

-1: Lecture entre les lignes de ce que SilentGhost * entend * plutôt que du code qu'il a écrit. Cela semble sûr d'url, c'est au prix d'une perte d'information. La bonne façon de coder les données pour une URL est d'utiliser urlencode(). – symcbean

3

caractères indésirables première bande

$new_string = preg_replace("/[^a-zA-Z0-9\s]/", "", $string); 

change ensuite des espaces pour unserscores

$url = preg_replace('/\s/', '-', $new_string); 

Enfin encode prêt à l'emploi

$new_url = urlencode($url); 
+1

Le trait de soulignement est un caractère différent: '_' est un trait de soulignement,' -' est un trait d'union. Utiliser aussi 'urlencode' sur une telle chaîne ne change rien. Vous oubliez également hypen dans la première regex et '\ s' n'est pas équivalent au caractère espace. – SilentGhost

0

Cela fera dans un shell Unix (je viens d'essayer sur mon Mac OS):

$ tr -cs A-Za-z '-' <infile.txt> outfile.txt 

J'ai eu l'idée d'un billet de blog sur More Shell, Less Egg

1

Essayez cette

function clean($string) { 
     $string = str_replace(' ', '-', $string); // Replaces all spaces with hyphens. 
     $string = preg_replace('/[^A-Za-z0-9\-]/', '', $string); // Removes special chars. 

     return preg_replace('/-+/', '-', $string); // Replaces multiple hyphens with single one. 
    } 

Utilisation:

echo clean('a|"[email protected]£de^&$f g'); 

Affichera: abcdef-g

source: https://stackoverflow.com/a/14114419/2439715

0

Tous les asnwers précédents traitent avec l'URL, mais dans le cas où quelqu'un devra désinfectez chaîne pour la connexion (par exemple) et de le conserver sous forme de texte, ici est vous allez:

function sanitizeText($str) { 
    $withSpecCharacters = htmlspecialchars($str); 
    $splitted_str = str_split($str); 
    $result = ''; 
    foreach ($splitted_str as $letter){ 
     if (strpos($withSpecCharacters, $letter) !== false) { 
      $result .= $letter; 
     } 
    } 
    return $result; 
} 

echo sanitizeText('ОРРииыфвсси ajvnsakjvnHB "&nvsp;\n" <script>alert()</script>'); 
//ОРРииыфвсси ajvnsakjvnHB &nvsp;\n scriptalert()/script 
//No injections possible, all info at max keeped