Laravel中如何移除textarea存储的<p>标签并实现换行显示
解决Laravel Collective Textarea存储后
标签显示问题
这问题大概率是你存储内容时,用了富文本编辑器或者nl2br()这类方法把换行转成了HTML段落标签,导致数据库里存的是带<p>的内容,编辑时直接输出就会把标签显示出来。给你几个实用的解决办法:
方法一:编辑页读取时直接处理内容
在blade模板的textarea组件里,直接对取出的数据库内容做替换:
{!! Form::textarea('content', str_replace(['<p>', '</p>'], ['', "\n"], $yourModel->content), ['class' => 'form-control']) !!}
这里用str_replace把<p>清空,</p>换成换行符\n,这样textarea里就会按原段落换行显示,不会出现标签。
方法二:存储时提前处理避免生成
标签
如果不需要保留任何HTML标签,存储前直接剥离所有标签并保留换行:
// 在控制器的存储/更新方法里 $content = preg_replace('/\r\n|\r|\n/', "\n", strip_tags($request->input('content'))); $yourModel->content = $content; $yourModel->save();
要是只想去掉<p>标签,保留其他可能的格式(如果有的话),就用精准替换:
$content = str_replace(['<p>', '</p>'], ['', "\n"], $request->input('content'));
方法三:用正则匹配处理更复杂的段落情况
如果有些<p>标签里带属性(比如<p class="xxx">),上面的简单替换就不管用了,这时候用正则匹配:
{!! Form::textarea('content', preg_replace('/<p[^>]*>(.*?)<\/p>/s', '$1'."\n", $yourModel->content), ['class' => 'form-control']) !!}
这个正则会匹配所有带属性的<p>标签,只保留段落内容并加上换行。
注意事项
- 用
{!! !!}输出时要注意XSS风险,如果内容是用户输入的,建议先做安全过滤,比如结合e()函数转义后再处理,或者在存储时就清理掉危险标签。 - 要是你用了TinyMCE、CKEditor这类富文本编辑器,也可以直接在编辑器的配置里关闭自动添加
<p>标签的功能,从源头解决问题。
内容的提问来源于stack exchange,提问作者mahdi.gh
相关产品推荐
相关产品推荐

