Я пытаюсь удалить все специальные символы, например

() [] {} ~ `@ # $% ^ & * _ + = / |. ,،;: ?؟> <

Но этот код удалит весь специальный символ плюс неанглийский символ, я хочу удалить только специальный символ, а не английский. Я означает, что принимаю только английский + не английский, но не специальный символ.

preg_replace("/[^A-Za-z0-9\-]/", "-", $_REQUEST["title"]);
1
Pedram 14 Мар 2015 в 12:00

2 ответа

Лучший ответ

Используйте свойство unicode:

preg_replace("/[^\p{L}\p{N}]/u", "-", $_REQUEST["title"]);

Это заменит любой символ, не являющийся буквой и не цифрой, на тире.

Редактировать согласно комментарию:

$regex = array('/[^\p{L}\p{N}\s]/u', '/\s/');
$repl  = array('', '-');
preg_replace($regex, $repl, $_REQUEST["title"]);
1
Toto 14 Мар 2015 в 13:18

В результате обсуждения в комментариях это может помочь вам начать:

<?php

$subject = "This is a string ()[]{}~`@#\$%^&?؟*_+=/|.,،;:' getting stripped.";

$pattern = sprintf('/[%s]/', preg_quote("()[]{}~`@#$%^&?؟*_+=/|.,،;:'", '/'));
$subject = preg_replace($pattern, '', $subject);

echo $subject."\n";

О предотвращении внедрения sql вы также упомянули: как сказано в комментариях к вопросу, вы должны использовать современный адаптер базы данных (mysqli или PDO) и «подготовленные операторы». Вы найдете объяснение этого в документации. Все остальное - это «лишь немного исправить проблему», что вообще не имеет смысла.

1
arkascha 14 Мар 2015 в 10:19