WordPress - 如何在不丢失换行符的情况下清理文本区域中的多行文本?
Posted
技术标签:
【中文标题】WordPress - 如何在不丢失换行符的情况下清理文本区域中的多行文本?【英文标题】:WordPress - How to sanitize multi-line text from a textarea without losing line breaks? 【发布时间】:2013-12-24 23:50:22 【问题描述】:如果我像这样清理并保存用户输入的一些元文本(称为“消息”)......
update_post_meta($post_id, 'message', sanitize_text_field($_POST['message']));
...然后检索并尝试重新显示这样的文本...
echo '<textarea id="message" name="message">' . esc_textarea( get_post_meta( $post->ID, 'message', true ) ) . '</textarea>';
...所有换行符都会丢失。
根据 WordPress 法典,sanitize_text_field() 函数正在删除换行符。那么如何在不丢失换行符的情况下清理用户输入的文本呢?
【问题讨论】:
【参考方案1】:自 Wordpress 4.7.0
使用sanitize_textarea_field 代替sanitize_text_field
【讨论】:
谢谢。很遗憾,没有办法改变最佳答案——尤其是。因为这个答案可能需要数年时间才能获得比所选最佳答案更多的支持。 这是你们都在寻找的。应该替换其他答案。 这才是真正的解决方案。【参考方案2】:更优雅的解决方案:
update_post_meta(
$post_id,
'message',
implode( "\n", array_map( 'sanitize_textarea_field', explode( "\n", $_POST['message'] ) ) )
);
如果您想清理文本字段,请使用 sanitize_text_field
。
【讨论】:
谢谢 - 这不仅优雅,而且精彩。 我不会更改用户输入,而是直接使用 $wpdb->query() 插入一个帖子元,这样可以避免 WordPress 对元输入清理的无聊,而你不需要适合您的特殊情况。【参考方案3】:如果换行符是唯一的东西 sanitize_text_field
正在删除你想保留的东西,你可以在调用 sanitize_text_field
之前和之后为 "\n"
使用 str_replace
。
$fake_newline = '--OMGKEEPTHISNEWLINE--'; # or some unique string
$escaped_newlines = str_replace("\n", $fake_newline, $_POST['message']);
$sanitized = sanitize_text_field($escaped_newlines);
update_post_meta($post_id, 'message', str_replace($fake_newline", "\n", $sanitized));
如果您想更多地自定义清理,您可能应该依赖 WordPress 提供的更细粒度的 sanitize_*
函数。
【讨论】:
谢谢。您的代码中有几个错误,但我明白了。这是工作代码: $NEW_LINE = "\n"; $NEW_LINE_SUBSTITUTE = "NEWLINE-SUBSTITUTE"; update_post_meta($post_id, 'message', sanitize_text_field(str_replace($NEW_LINE, $NEW_LINE_SUBSTITUTE, $_POST['message'] )) );回声'';【参考方案4】:我自己一直在尝试使用这种方法,发现 textarea 中的撇号在输入时被反斜杠转义,然后在输出时不会被 esc_textarea 删除。
所以我最终不得不使用
stripslashes( esc_textarea( $THING ) )
在重新显示时成功地将它们从文本区域中删除。
【讨论】:
【参考方案5】:尝试了所有方法,我能够完成这项工作的唯一方法是:
函数.php
wp_customize->add_section('section_id', array(
'title' => __('custom_section', 'theme_name'),
'priority' => 10,
'description' => 'Custom section description',
));
$wp_customize->add_setting('custom_field', array(
'capability' => 'edit_theme_options',
'sanitize_callback' => 'sanitize_textarea_field',
));
$wp_customize->add_control('custom_field', array(
'type' => 'textarea',
'section' => 'custom_section',
'label' => __('Custom text area with multiline brakes'),
));
显示在前面(例如footer.php)
<?php $custom_field= get_theme_mod('custom_field');
if ($custom_field)
echo nl2br( esc_html( $custom_field) );
?>
必须使用'sanitize_callback' => 'sanitize_textarea_field'
和nl2br( esc_html())
才能工作。
【讨论】:
以上是关于WordPress - 如何在不丢失换行符的情况下清理文本区域中的多行文本?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不丢失触摸事件的情况下冻结 UIScrollView 滚动