2010-06-11 18 views
17

Chciałbym odseparować ciąg na adres URL, więc to jest to, czego potrzebuję.Wyrażenie regularne Sanitize (PHP)

  1. Wszystko musi zostać usunięte oprócz znaków alfanumerycznych i spacji oraz przerywanych.
  2. Przestrzenie powinny być konwertowane na myślniki.

Np.

This, is the URL! 

musi powrócić

this-is-the-url 
+0

nic nie widzimy, proszę poprawnie sformatuj swój kod. – jigfox

+0

Hi Jeny, nie mam pojęcia o kodzie i to jest to, czego potrzebuję pomocy. Jedyne, co wiem, to to, że powinien używać preg_replace(), ale nie wiem, jakie powinno być wyrażenie regularne. Dzięki –

Odpowiedz

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

wielkie dzięki .. Tylko jedna edycja .. Chcę usunąć kreski od początku i końca przed zwróceniem $ z właśnie na wypadek, gdyby istniały. –

+0

@ atif089: dodano – SilentGhost

+0

-1: Czytanie między liniami tego, co SilentGhost * zamierza * zamiast kodu, który napisał. wydaje się to bezpieczne dla adresów URL, ale dzieje się to kosztem utraty informacji. Właściwym sposobem kodowania danych dla adresu URL jest użycie funkcji urlencode(). – symcbean

3

pierwszy pasek niechciane znaki

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

Następnie zmienia przestrzenie dla unserscores

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

Wreszcie zakodować to gotowy do użycia

$new_url = urlencode($url); 
+1

podkreślenie jest inną postacią: '_' jest znakiem podkreślenia,' -' jest łącznikiem. Również użycie 'urlencode' na takim łańcuchu nic nie zmienia. Zapominamy również o hipomie w pierwszym wyrażeniu regularnym, a '\ s' nie jest równoważne z postacią spacji. – SilentGhost

0

Będzie to zrobić w powłoce Unix (Po prostu próbowałem go na MacOS):

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

wpadłem na pomysł z blogu na More Shell, Less Egg

1

Try To

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. 
    } 

Zastosowanie:

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

wyświetli: abcdef-g

źródło: https://stackoverflow.com/a/14114419/2439715

0

Wszystkie poprzednie asnwers czynienia z adresem URL, ale w przypadku niektórych z nich będzie trzeba zdezynfekować ciąg do logowania (np) i zachować go jako tekst tutaj czy idziesz:

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