【问题标题】:Loading large text into a Zend textarea from a database将大文本从数据库加载到 Zend textarea
【发布时间】:2013-03-13 23:59:51
【问题描述】:

我正在尝试填充像这样定义的textarea

$this->addElement('textarea', 'body', array(
  'label' => $translate->translate('Contents:'),
  'cols' => '80',
  'rows' => '24',
  'required' => true
));

来自数据库记录。该记录是一个 BLOB,其中包含页面的 HTML 文本,采用 UTF-8 格式。

$form->populate(array(
  // ...
  'body' =>
    str_replace("\\n", "\n",
      html_entity_decode(
        $page['body']
      )
    ),
  // ...
));

不幸的是,当文本长度大于 2934 字节时,该字段根本不会被填充。我尝试通过发出设置maxlength

  'maxlength' => '4096',

但是好像没有效果。

现在,根据我在网上找到的信息,textarea 的限制应该大于 2934 字节,更接近 30-60 KB。除了将字段拆分为两个单独的表单元素之外,我该如何解决这个问题?

更新 罪魁祸首似乎是字符“ß”,它在数据库中被编码为两个字符,“Ô。该字符第一次出现在文本中的位置 2934,因此双字节表示中的第二个字符以某种方式破坏了该字段完全接收文本。

【问题讨论】:

  • 您确定问题不是从数据库中取出 blob 吗?问题似乎更可能存在,而不是让表单元素获取那么多数据。
  • 不,我很肯定正在从数据库中检索文本,原因有两个:1)我尝试简单地echoing 它,成功了,2)如果我改为使用substr($page['body'], 1, 2934),表单元素已正确填充。 substr($page['body'], 1, 2935) 已经不是了。
  • 将 HTML 吐出到 textarea... 如果您查看页面源代码,是否所有内容都在那里?您可能需要考虑使用 WYSIWYG 编辑器或通过htmlentitites() 运行它。见:stackoverflow.com/questions/3777297/…
  • 没有 html_entity_decode 和/或 str_replace 是否可以工作?
  • html_entity_decode 的默认编码是 UTF-8。至于str_replace...“在多字节字符串上使用单字节字符串函数可能会导致意外结果”,参考:stackoverflow.com/questions/3786003/… 可能更改为preg_replace - 很确定无需触摸mb_ereg_replace

标签: html zend-framework textarea


【解决方案1】:

正如问题更新中所述,罪魁祸首是字符“ß”,该字符在数据库中被编码为两个字符“Ô。该字符第一次出现在文本中的位置 2934,因此双字节表示中的第二个字符不知何故破坏了该字段完全接收文本。

正如 ficuscr 在他的评论中指出的那样,破坏文本的是对 str_replace 函数的调用。将其替换为调用preg_replace 后,文本已正确保存在数据库中,并且该字段收到了全文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2016-10-20
    • 1970-01-01
    • 2013-12-15
    • 2017-11-29
    • 2013-01-19
    相关资源
    最近更新 更多