URL编码从JS到Drupal的字符串

时间:2012-05-17 14:00:41

标签: javascript drupal uri url-encoding

我有一个使用Ajax的Drupal Web应用程序;有时,Ajax函数需要将字符串作为参数传递给Drupal函数

$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value),  

当值包含斜杠时,无法从作为

的Drupal函数中识别
 function get_value($value) {
       print urldecode($value);

例如,如果传递的字符串是ABC / 123,则get_value仅打印ABC

如何解决这个问题,从PHP / Drupal传递斜杠并获取整个字符串?

7 个答案:

答案 0 :(得分:6)

使用%2f代替/

$.ajax({url: "index.php?q=get_value" + "%2f" + encodeURIComponent(value),  

[reference],见第2.2节

或者,更可读的替代方案:

$.ajax({url: "index.php?q=" + encodeURIComponent("get_value/"+value),

答案 1 :(得分:2)

你的问题是Drupal将斜杠解释为路径分隔符,因此它将get_value / val1 / val2 / val3中的第一个参数提取为$ value ...你可以让Drupal拆分参数,但你需要重新组合它们。以下是Drupal7的一个例子。

在你的菜单系统中,你必须确保drupal将使用所有参数回调你的get_value函数:

function mymodule_menu {
   $items['get_value'] = array(
      'page callback' => 'mymodule_get_value',
   );
   return $items;
}

然后重新组合动态的参数数量:

function mymodule_get_value() {
   $args = func_get_args();
   $value = implode('/', $args);
   // do what you need with $value here
}

希望这有帮助!

答案 2 :(得分:1)

也许我在这里遗漏了一些东西,但你不能只是连接你的查询字符串并将其传递给ajax函数吗?也许你可以使用parse_url()

您的get_value()可能是个问题。从PHP的urdecode()手册:“superglobals $ _GET和$ _REQUEST已经被解码。在$ _GET或$ _REQUEST中的元素上使用urldecode()可能会产生意想不到的危险结果。”

答案 3 :(得分:1)

如果这是你的确切代码,那么你有一个语法错误(一个额外的引用),第一行应该是:

$.ajax({url: "index.php?q=get_value/" + encodeURIComponent(value),  

答案 4 :(得分:1)

你能否提供一些关于PHP函数在哪里的更多细节 - 它是否在Drupal自定义模块中?如果它在自定义模块中,您是否在get_value路径中使用menu_hook?另外,你使用的是哪个版本的Drupal?另一件事是你可以用Drupal.encodeURIComponent(Drupal 6)或Drupal.encodePath(Drupal 7)替换encodeURIComponent。

答案 5 :(得分:1)

了解您的路由系统正在做什么会有所帮助,首先,您在调试时会看到什么?

 function get_value($value) {
   var_dump($value);
   print urldecode($value);

您可以尝试的另一个选项是传递带有双引号的变量,因此它们被解释为字符串。

$.ajax({url: "index.php?q=get_value/\"" + encodeURIComponent(value) + "\"", 

答案 6 :(得分:1)

在对URL进行解码之前,您应该检查PHP函数的$ value参数是否包含斜杠之后的部分。

解决此问题的一种方法是在编码之前替换字符串中的斜杠,然后在PHP中解码后将其替换回来。这是一个用回车符替换斜杠的示例:(你应该使用一个字符串,否则你的字符串中找不到)

$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value.replace("/", "\r")),

用PHP代码来反转这个:

function get_value($value) {
    print str_replace("\r", "/", urldecode($value));

您可能需要尝试其他一些字符(您也可以使用字符序列而不是单个字符)并查看哪些有效。剥离URL编码斜杠的逻辑也可能剥离其他字符。