javascript - 用于具有相同输出的转义字符串的 PHP 和 javascript
问题描述
我知道默认情况下 javascript 会忽略反斜杠 \ 字符。我正在尝试在 PHP 和 Javascript 中编写 2 个方法,这些方法应该提供相同的输出。
示例:以下是原始字符串“.\+*?[^]$(){}=!<>|:-”
在阅读了原始字符串中的每个字符后,我得到了以下结果:
- 在 PHP中:".\+*?[^]$(){}=!<>|:-"
转义字符串为: ".\\\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-"
转义后的字符串是: ".\+*?[^]$(){}=!<>|:-" (与原始字符串一样)
- 在 Javascript中: .+*?[^]$(){}=!<>|:- (丢失的反斜杠 \ 字符)
转义字符串为: "\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:\-" (与PHP因为在阅读方法中丢失了反斜杠\字符)
转义后的字符串是:".+*?[^]$(){}=!<>|:-" (带有丢失的反斜杠 \ 字符)
对于任何给定的字符串(包括反斜杠 \ 字符),我怎样才能获得相同的 PHP 和 JS 的转义输出?
以下是 PHP 和 JS 中的代码
PHP
class Constants { /* List of following special characters : [.\+*?[^]$(){}=!<>|:-] */ public static $ESCAPEDCHARS = [".", "\\", "+", "*", "?", "[", "^", "]", "$", "(", ")", "{", "}", "=", "!", "<", ">", "|", ":", "-"]; public static $SLASH = "\\"; public static function escapedArrayHasChar($char) { foreach (Constants::$ESCAPEDCHARS as $value) { if (strcmp($value, $char) === 0) { return true; } } return false; }} class Tools { public static function escaped($str) { $length = strlen($str); $result = ""; for ($index = 0; $index < $length; $index++) { if (Constants::escapedArrayHasChar($str[$index])) { $result .= Constants::$SLASH . $str[$index]; } else { $result .= $str[$index]; } } return $result; } public static function descaped($str) { $length = strlen($str); $result = ""; for ($index = 0; $index < $length - 1; $index++) { if (strcmp(Constants::$SLASH, $str[$index]) === 0 && Constants::escapedArrayHasChar($str[$index + 1])) { $result .= $str[$index + 1]; $index++; } else { $result .= $str[$index]; } if ($index === $length - 2) { $result .= $str[$index + 1]; } } return $result; }}
JAVASCRIPT
$(function () { /*List of following special characters : [.\+*?[^]$(){}=!<>|:-] */ var ESCAPEDCHARS = [".", "\\", "+", "*", "?", "[", "^", "]", "$", "(", ")", "{", "}", "=", "!", "<", ">", "|", ":", "-"]; var SLASH = "\\", DOUBLESLASH = "\\\\"; $.equals = function (str1, str2) {return str1 === str2;}; $.escapedArrayHasChar = function (cr) { var index = 0; for (index = 0; index< ESCAPEDCHARS.length; index++) { if ($.equals(ESCAPEDCHARS[index], cr)) { return true; } } return false; }; $.escaped = function (str) { var length = str.length; var result = "", index = 0; for (index = 0; index < length; index++) { if ($.escapedArrayHasChar(str[index])) { result += SLASH + str[index]; } else { result += str[index]; } } return result; }; $.descaped = function (str) { var length = str.length; var result = "", index = 0; for (index = 0; index < length - 1; index++) { if ($.equals(SLASH, str[index]) && $.escapedArrayHasChar(str[index + 1])){ result += str[index + 1]; index++; }else { result += str[index]; } if (index === length - 2) { result += str[index + 1]; } } return result; }; });
我认为唯一的解决方案是确保将 2 个反斜杠导入到任何需要检查的字符串中。如果字符串对于 \ 字符有 2 个反斜杠,则 PHP 和 JS 都会给出相同的输出。
解决方案
好吧,这似乎需要很多代码来处理这个问题——我可能会去编码。例如,在 base64 编码中,该字符串为:“LlwrKj9bXl0kKCl7fT0hPD58Oi0="。在 php 中,base64_decode
将返回您的字符串,在 javascript 中atob
也将返回它。在一般情况下,您可以使用base64_encode
和 在 javascript 中使用btoa
.