2

我不明白为什么 replace() 函数在我的 jQuery 函数中不起作用:

jQuery(document).ready(function($){
   var amount_min =  <?php if($_GET['amount_min']) echo $_GET['amount_min']; else echo '0'; ?>;
   var amount_min = amount_min.replace(/[^\d]/g, "");
   $('input[name=amount]').val(amount_min);
});

无论我给出什么输入(例如“100ab”或“10.000”),它都不会用“100”或“10000”替换它。怎么做?

4

4 回答 4

2

你忘了放双引号。

var amount_min = "<?php if($_GET['amount_min']) echo $_GET['amount_min']; else echo 0; ?>";

因为,replace在字符串中工作。


更新#1

如果出于任何宗教原因您不想将 PHP 用双引号括起来,则将它们与数字一起输出。

var amount_min = <?php echo '"' . ($_GET['amount_min'] ? $_GET['amount_min'] : 0) . '"'; ?>;

更新#2

您可以使用的强制验证:

var amount_min = <?php echo '"' . (int)($_GET['amount_min']) . '"'; ?>;
于 2012-12-29T15:40:55.850 回答
1

您的 PHP 代码正在输出一个数字:

var amount_min = 100;

由于您需要一个字符串,因此请将其用引号括起来:

var amount_min =  "<?php if($_GET['amount_min']) echo $_GET['amount_min']; else echo '0'; ?>";

我已经很多年没有接触过 PHP,但我认为你可以稍微简化一下代码:

var amount_min =  "<?php echo($_GET['amount_min'] || '0'); ?>";

另外,你为什么不直接GET用 JavaScript 获取参数呢?

于 2012-12-29T15:40:59.470 回答
1

你能试试这个:

$(document).ready(function(){

     var amount_min =  "<?php if($_GET['amount_min']){ echo $_GET['amount_min'];}else{ echo '0';} ?>";

      console.log("original-> "+amount_min);

      var amount_min = amount_min.replace(/\D/g,'');

      console.log("replaced-> "+amount_min); 
});
于 2012-12-29T15:41:02.293 回答
1

您不需要.replace()代码(它也只适用于字符串);PHP 已经可以为您进行正确的转换:

$(function() {
   var amount_min = <?php echo isset($_GET['amount_min']) ? (int)$_GET['amount_min'] : 0; ?>;
   $('input[name=amount]').val(amount_min);
});

您也可以为此使用过滤:

<?php echo filter_input(INPUT_GET, 'amount_min', FILTER_VALIDATE_INT, array('options' => array('default' => 0))); ?>

请注意,它filter_input不会接受类似的值100abc,因此请明智地使用。

如果你仍然想在 JavaScript 中安全地使用字符串,你应该使用 json_encode()。

顺便说一句,任何涉及echo在 JavaScript 代码中未修改来自 PHP 的请求变量的答案都是错误的,并且可能导致 XSS 攻击!你被警告了。

更新

基于正则表达式的替换也可以在 PHP 中完成:

var amount_min = <?php echo (int)preg_replace('/\D+/', '', isset($_GET['amount_min']) ? $_GET['amount_min'] : 0); ?>;

由于所有非数字都被删除,您可以安全地应用(int)演员表。

于 2012-12-29T15:55:51.253 回答