Javascript 将字符串从JS编码为Drupal的URL

Javascript 将字符串从JS编码为Drupal的URL,javascript,drupal,uri,url-encoding,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_值仅打印ABC 我如何

我有一个使用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_值仅打印ABC


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

也许我在这里遗漏了一些东西,但是您不能将查询字符串连接起来并将其传递到
ajax
函数中吗?也许你可以用


您的
get\u value()
可能是个问题。PHP手册中写道:“superglobals$\u GET和$\u请求已经被解码。对$\u GET或$\u请求中的元素使用urldecode()可能会产生意外和危险的结果。”

如果这是您的确切代码,那么您会出现语法错误(额外的引号),第一行应该是:

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

使用
%2f
而不是
/
作为:

$.ajax({url: "index.php?q=get_value" + "%2f" + encodeURIComponent(value),  
[],见第2.2节

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

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

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

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

 function get_value($value) {
   var_dump($value);
   print urldecode($value);
您可以尝试的另一个选项是传递带有双引号的变量,以便将其解释为字符串

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

您的问题是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
}

希望这有帮助

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

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

和PHP代码来扭转这种局面:

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

您可能需要尝试一些其他字符(您也可以使用字符序列而不是单个字符),然后看看什么是有效的。去掉URL编码斜杠的逻辑也可能去掉其他字符

我添加了php和js标记。因为这与php和js更相关。希望有人能回答这个问题。URL的构造看起来有点奇怪,它真的生成了正确的URL吗?更可读的等价物:$.ajax({URL:“index.php?q=“+encodeURIComponent”(“get_value/”)+value),
function get_value($value) {
    print str_replace("\r", "/", urldecode($value));