Очень часто строки переходя их одной среды в другую нуждаются в экранированнии символов ' или ". самый простой способ это сделать это воспользоваться простой заменой ' на \' с помощью функции: Код (PHP): $str="aaaaa'aaaaaa"; $str=str_replace("'","\'",$str); // $str="aaaaa\'aaaaaa"; но если этуже строку еще раз пропустить через этотже алгоритм то результат будет ошибочным Код (PHP): $str="aaaaa\\'aaaaaa"; поскольку два слэша экранируют друг друга то ' остается. можно поставить регулярное выражение чтобы символ ' экранировался только если перед ним нет символа слэша. Но этот способ тоже не будет работать во всех ситуациях потомучто если есть не один а два слэша то символ ' нужно экранировать. Вообщем задача очень распространенная но к сожалению я не нашел элегантного решения, в итоге она сводится к : если перед символом ' нет слешей или их четное количество тогда нужно экранировать ' . Как указать в регулярке что количество символов четное. Или может вы решаете эту задачу както по другому? Буду очень благодарен за помощь, и надеюсь что решение этой проблемы еще комунибуть пригодится.
да addslashes() справляется с задачей, но если символ уже был заэкранирован тогда получится двойное экранирование тогда появляются надписи типа "Don\'t give me". Я ищу решение которое будет срабатывать только если это необходимо для дальнейшей работы.
у меня система кэша которая читает и записывает данные в файл .php. В файле php ограничителем строки является символ ', если в строке найден этот символ он экранируется. Бывают ситуации когда данные записыные в кэш выводятся, обрабатываются и потом заново записываются в файл, при этом они проходят ту же процедуру экранирования. В итоге получается двойное экранирование.
addslashes(stripslashes(stripslashes($a))) - думаю должно прокатить это конечно если данные каким-то непонятным образом были несколько раз заслешены
Интересно но это не очень красиво. хотя ... думаю это будет быстрее работать чем какаянибуть замученая регулярка. При этом гарантирует безопасность данных и то что данные не будут нарастать лишними \. Огромное спасибо. Может есть еще идеи ?
для "магических кавычек" есть чудесное решение PHP: if(get_magic_quotes_gpc()) return stripslashes($val);
addslashes(stripslashes($a)) работает хорошо только пачемуто он последовательность "\\" без " ' " после, удаляет. тоесть строка "'sdffsd\\'fs\cvb'cvb\\\'cbvcv\\bcvb" превращается в "\'sdffsd\'fscvb\'cvb\\\'cbvcvbcvb" что в принципе не плохо, но могут оказаться ситуации в которых это сыграет злую шутку.
можно переписать функцию stripslashes() чтобы она реагировала более адекватно на последовательность "\\"
в итоге получается очень странная функция но которая удовлетворяет всем запросам: 1. Если строка уже была экранирована то повторного процесса не происходит 2. Обеспечивается безопасность данных если в качестве обрамления строки используется символ " ' ". Код (Text): function ec_slash($var) { $var=str_replace("\\'","'",$var); $var=str_replace("\\\\","\\",$var); $var=str_replace("\\","\\\\",$var); $var=str_replace("'","\\'",$var); return $var; }
Код (PHP): $str="\'sdffsd\'fscvb\'cvb\\\'cbvcvbcvb"; if(false!==strpos($str,'\\')) { $str=preg_replace('/\\\/','',$str); $str=addslashes($str); } else { $str=addslashes($str); } echo $str;// \'sdffsd\'fscvb\'cvb\'cbvcvbcvb Сразу замечу. Если вы будете работать с базой данных, то не используйте addslashes в целях безопасности, воспользуйтесь функцией mysqli_real_escape_string.
Хрень какая-то, данные должны циркулировать в исходном виде и экранироваться только перед конечным выводом (в базу). Если мешают кавычки при передаче, можно конвертить в base64, так почта делает чтобы символы не портили протокол.
Попробуйте это Код (PHP): function single_escape_string($v){ if(empty($v)) return ''; $a=strlen($v); $p=''; $s=false; $r=''; for($i=0;$i<$a;$i++){ $b=$v[$i]; if($i<$a-1) $n=$v[$i+1]; else $n=''; if($b=="'"){ if($p=="'" || $s){ $r.=$b; $p=''; $s=false; continue; } else if($n!="'") $r.="'"; } $r.=$b; if($b=="\\" && !$s) $s=true; else $s=false; if($s) $p=''; else $p=$v[$i]; } return $r; }