Обеззараживание регулярных выражений (PHP) - PullRequest
17 голосов
/ 11 июня 2010

Я бы хотел санировать строку в URL, так что это то, что мне в основном нужно.

  1. Все должно быть удалено, кроме буквенно-цифровых символов, пробелов и тире.
  2. Пробелыдолжен быть преобразован в тире.

Например.

This, is the URL!

должен возвращаться

this-is-the-url

Ответы [ 5 ]

42 голосов
/ 11 июня 2010
function slug($z){
    $z = strtolower($z);
    $z = preg_replace('/[^a-z0-9 -]+/', '', $z);
    $z = str_replace(' ', '-', $z);
    return trim($z, '-');
}
4 голосов
/ 11 июня 2010

Первая полоска нежелательных символов

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

Затем изменяет пробелы для непоследовательных значений

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

Наконец кодирует его готовым к использованию

$new_url = urlencode($url);
1 голос
/ 07 апреля 2016

Попробуйте

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

Использование:

echo clean('a|"bc!@£de^&$f g');

Будет выводить: abcdef-g

источник: https://stackoverflow.com/a/14114419/2439715

0 голосов
/ 04 июля 2017

Все предыдущие ответы имеют дело с URL-адресом, но в случае, если кому-то потребуется очистить строку для входа в систему (например,) и сохранить ее в виде текста, вот вам:

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
0 голосов
/ 06 декабря 2015

Это будет сделано в оболочке Unix (я только что попробовал это на моем MacOS):

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

Идея пришла из блога на More Shell, Less Egg

...