【问题标题】:php explode() not working when receiving string from javascript从javascript接收字符串时phpexplode()不起作用
【发布时间】:2017-03-15 23:28:10
【问题描述】:

我从 javascript 获取数据值并附加一个带有参数的 smarty 模板。使用 smarty 函数,我想用 php 分解字符串。

HTML:

 <div class="item-wrapper pre_element_block draggable-column ui-widget-content" data-floated_width="col-md-12" data-width_info="12">

这是javascript:

function row_droppable (droppableContainer) {
    $(droppableContainer).on('drop',function(event,ui){
        if(ui.draggable.hasClass('draggable-column')) {
            id = get_random_string();
            var grid = ui.draggable.attr("data-width_info");
            gridRow = $(`{include file=$oPlugin->cAdminmenuPfad|cat:'templates/ns.cs.grid_row.tpl' grid='` + grid + `' idUnique='`+id+`'}`).appendTo(droppableContainer);
        }
    });  
}

模板/ns.cs.grid_row.tpl

我打电话:

    {js_string_convert string=$grid}

这是我的 php/smarty 函数:

$smarty->register_function("js_string_convert", "js_string_convert");

function js_string_convert($params,$smarty) {
    if(!empty($params['string'])) {
        $colArr = explode("_", $params['string']);
        $smarty->assign('colArr',$colArr);
    }
}

当我在 php 中转储数据 $params['string'] 时,它会输出:

 string(12) "4_4_4"

所以我尝试爆炸字符串:

$colArr = explode("_", $params['string']);

当我转储 $colArr 时,它会输出:

array(1) {
    [0] => string(12) "4_4_4"
}

这快把我逼疯了。它与从javascript接收字符串有关吗?

更新: 转储字符串的长度取决于我的 javascript 中变量的长度。 string(12) 是因为变量grid 太长了。当我将 grid 更改为 adasdasdasdasdasdasd 时,字符串为 string(33) 例如

【问题讨论】:

  • strpos($params['string'],"_") 是否返回假?
  • 是的,它返回 false。
  • 可能是编码问题?下划线不是下划线...
  • 尝试对字符串中的每个字符进行ord,并确保下划线与实际的ord("_") 值匹配。
  • 下划线来自html data-width="4_4_4"。在 jQuery 中,我通过 .attr('data-width') 获取此值,并使用此值附加一个 smarty 模板。

标签: javascript php smarty explode


【解决方案1】:

var_dump("4_4_4") 应该返回 string(5) "4_4_4",而不是 string(12) 在你的情况下。可能您的字符串中有不可打印的符号或字符集编码问题。

您可以通过以下方式检查您的字符串:

var_dump( preg_match('/^\d+\_\d+\_\d+$/', $params['string']) );

如果您将收到false,那么您的字符串中不仅有[DIGIT][UNDERSCORE][DIGIT][UNDERSCORE][DIGIT](但很明显)。

您可以尝试通过以下方式查找包含三个正整数和两个下划线的字符串:

preg_match('/\d+\_\d+\_\d+/', $params['string'], $tmp);

如果 $tmp[0] 不为空,则可以分解 $tmp[0] 而不是原始字符串。

或者你可以尝试使用这个正则表达式来提取数字:

preg_match('/(\d+).*?(\d+).*?(\d+)/u', $params['string'], $tmp);

$tmp[1]$tmp[2]$tmp[3] 中可以是您的三个号码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 2018-06-25
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多