【发布时间】:2023-04-08 19:41:02
【问题描述】:
我网站的一部分允许用户在文本框中创建 cmets,以存储在 SQL 数据库中。因为很多人从word或其他地方复制/粘贴东西,我必须保留<p>和<br>标签来保持格式,还有<a>标签让用户创建自己的链接。其他一切都被剥离了。我是这样完成的:
$text = strip_tags( $text, '<br><a><p>' );
但是今天一个用户来找我,告诉我他们丢失了大部分文字,因为他们为了视觉效果做了一个箭头<-。所以现在我知道剥离标签会删除 < 之后的所有内容。
我可以使用preg_replace 实现类似的效果,如下所示:
preg_replace('/((?!<((\/)?p|br|a))<[^>]*>)/', "", $text);
但这仍然有一个缺点,即只有当标签跨越一行时才有效(我认为),留下 html cmets 和可能我不知道的其他一些东西。我有哪些选择?有没有万能的解决方案?我可以使用的图书馆?我大部分时间都是独自工作,所以我不太了解行业标准。
【问题讨论】:
-
如果我理解正确,您是在让用户在 cmets 文本框中输入 HTML 标签?
-
是的,只是因为人们从其他来源复制粘贴并希望提交时格式看起来相同。主要是间距。
-
那么这些用户使用 HTML 标签来格式化他们的文本?我建议只输入 HTML 编码,根本不允许用户输入 HTML。如果必须格式化,您可以查看富文本编辑器控件。
-
我可以使用 preg_replace 实现类似的效果...但这仍然有缺点,即仅当标签跨越一行时才有效(我认为)。并不是因为您可以使用一些修饰符使 PHP 中的正则表达式跨越多行。考虑您的正则表达式,但带有多行和不区分大小写标志:
preg_replace('/((?!<((\/)?p|br|a))<[^>]*>)/sim', "", $text); -
使用Markdown库