Регуляция регулярных выражений (PHP)

Я хотел бы дезинформировать строку в URL-адресе, поэтому мне это действительно нужно.

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

Eg.

This, is the URL!

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

this-is-the-url

Ответ 1

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

Ответ 2

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

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

Затем меняет пробелы для символов unserscores

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

Наконец, закодируйте его для использования

$new_url = urlencode($url);

Ответ 3

Попробуйте это

 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|"[email protected]£de^&$f g');

Выведет: abcdef-g

источник: fooobar.com/questions/43503/...

Ответ 4

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

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

Я получил идею из сообщения в блоге Больше оболочки, меньше яйца

Ответ 5

Все предыдущие адреса имеют отношение к 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

Ответ 6

Следующая строка заменит пробелы.

$str = str_replace(' ', '-', $str);

Тогда следующее утверждение удалит все, кроме буквенно-цифровых символов и пунктирной линии. (пробелов не было, потому что на предыдущем шаге мы заменили их тире.

// Char representation     0 -  9   A-   Z   a-   z  -    
$str = preg_replace('/[^\x30-\x39\x41-\x5A\x61-\x7A\x2D]/', '', $str);

Что эквивалентно

$str = preg_replace('/[^0-9A-Za-z-]+/', '', $str);

К вашему сведению: чтобы удалить все специальные символы из строки, используйте

$str = preg_replace('/[^\x20-\x7E]/', '', $str); 

\ x20 является шестнадцатеричным для пробела, который является началом символа Acsii, а \x7E - тильдой. Что касается википедии https://en.wikipedia.org/wiki/ASCII

Печатные символы Коды от 20hex до 7Ehex, известные как печатные символы, представляют собой буквы, цифры, знаки пунктуации и несколько разных символов. Всего 95 печатных символов.