Php 正确呈现存储的HTML

Php 正确呈现存储的HTML,php,regex,Php,Regex,“我的网站”的一部分允许用户在文本框中创建注释,并将其存储在SQL数据库中。因为很多人从word或其他地方复制/粘贴内容,我必须保留和标记以保持格式,还必须保留标记以允许用户创建自己的链接。其他的东西都脱光了。我是这样做到的: $text = strip_tags( $text, '<br><a><p>' ); 但是,这仍然有一个缺点,那就是只在标记跨越一行时工作(我想),留下html注释和一些我不知道的其他东西。我有什么选择?有一个全面的解决方案吗?我能用

“我的网站”的一部分允许用户在文本框中创建注释,并将其存储在SQL数据库中。因为很多人从word或其他地方复制/粘贴内容,我必须保留

标记以保持格式,还必须保留
标记以允许用户创建自己的链接。其他的东西都脱光了。我是这样做到的:

$text = strip_tags( $text, '<br><a><p>' );

但是,这仍然有一个缺点,那就是只在标记跨越一行时工作(我想),留下html注释和一些我不知道的其他东西。我有什么选择?有一个全面的解决方案吗?我能用的图书馆?我大部分是独自工作的,因此我并不真正了解行业标准。

我可以建议您对用户提交的数据进行编码,然后删除不允许的标记。这样,您就不会删除页面上通常显示的标记

请注意,在大字符串上运行复杂的正则表达式并不是很有效

从用户处获取输入,对其进行编码,这样您将保存
p
,然后您可以将其作为html插入页面,这样它将呈现为html,但没有实际的标记,这样您就不需要删除任何内容


您可以使用
htmlspecialchars(string)
这里有一个我建议您对用户提交的数据进行编码,然后删除不允许的标记。这样,您就不会删除页面上通常显示的标记

请注意,在大字符串上运行复杂的正则表达式并不是很有效

从用户处获取输入,对其进行编码,这样您将保存
p
,然后您可以将其作为html插入页面,这样它将呈现为html,但没有实际的标记,这样您就不需要删除任何内容


您可以使用
htmlspecialchars(string)
这里有一个我可以用preg\u replace实现类似的效果…但这仍然有一个缺点,即只有在标记跨越一行时才工作(我想)。不是真的!可以使用一些修饰符使PHP正则表达式跨越多行。考虑下面的例子,使用多行HTML字符串:

    <?php
        // $s IS A MULTILINE HTML SNIPPET CONTAINING THE FOLLOWING HTML TAGS
        // <div>, <a>, <blockquote>, <em>, <strong>, <span>, <br /> 
        $s  = "<div class='one'>
                    <a href='/link.php'>
                        <blockquote>
                            There is real Power in the Hearts of men: not just Power but
                            \"something so much powerful than Power\" that Power itself begs to \"power down\".
                        </blockquote>
                    </a>
                    <p class='lv'>
                        This Power is not in the Head nor in the Intellect nor in the Skills of Man...
                        <em class='em1'>but in the deep recess of the Human Heart...</em>
                        and it speaks volumes yet only very few understand its language -
                        <strong>The Language of Love</strong>
                        - The Greatest Power You can have.... The Power to which nothing is Impossible!!!
                    </p>
                    <br />
                    <span>Do you know this Power? <--</span>
                    <strong>Do you Speak Love???</strong>
                </div>";

        // THIS CONCISE REGEX PATTERN REMOVES ALL HTML TAGS WITHIN THE MULTILINE STRING
        // EXCEPT FOR TAGS LIKE: <a> <p> <br />
        // IT WOULD ALSO LEAVE <- OR <-- OR <------ UNTOUCHED
        $r  = preg_replace("#<(?!\/[ap]|[ap\-]|br).*?>#si", "", $s);
        echo ($r);

干杯,祝你好运……

我可以用preg\u replace实现类似的效果……但这仍然有一个缺点,那就是只有在标记跨越一行时才起作用(我认为)。不是真的!可以使用一些修饰符使PHP正则表达式跨越多行。考虑下面的例子,使用多行HTML字符串:

    <?php
        // $s IS A MULTILINE HTML SNIPPET CONTAINING THE FOLLOWING HTML TAGS
        // <div>, <a>, <blockquote>, <em>, <strong>, <span>, <br /> 
        $s  = "<div class='one'>
                    <a href='/link.php'>
                        <blockquote>
                            There is real Power in the Hearts of men: not just Power but
                            \"something so much powerful than Power\" that Power itself begs to \"power down\".
                        </blockquote>
                    </a>
                    <p class='lv'>
                        This Power is not in the Head nor in the Intellect nor in the Skills of Man...
                        <em class='em1'>but in the deep recess of the Human Heart...</em>
                        and it speaks volumes yet only very few understand its language -
                        <strong>The Language of Love</strong>
                        - The Greatest Power You can have.... The Power to which nothing is Impossible!!!
                    </p>
                    <br />
                    <span>Do you know this Power? <--</span>
                    <strong>Do you Speak Love???</strong>
                </div>";

        // THIS CONCISE REGEX PATTERN REMOVES ALL HTML TAGS WITHIN THE MULTILINE STRING
        // EXCEPT FOR TAGS LIKE: <a> <p> <br />
        // IT WOULD ALSO LEAVE <- OR <-- OR <------ UNTOUCHED
        $r  = preg_replace("#<(?!\/[ap]|[ap\-]|br).*?>#si", "", $s);
        echo ($r);

干杯,祝你好运…

使用html净化器。它有助于清理汇总的html并删除不需要的代码,例如,如果用户在提交之前添加了可能对您的网站(XSS攻击)html净化器造成伤害的脚本标记。它还添加或完成html,例如用户输入玩家。。。在不关闭标记的情况下,它将关闭标记并输出更干净的html

使用html净化器。它有助于清理汇总的html并删除不需要的代码,例如,如果用户在提交之前添加了可能对您的网站(XSS攻击)html净化器造成伤害的脚本标记。它还添加或完成html,例如用户输入玩家。。。在不关闭标记的情况下,它将关闭标记并输出更干净的html

如果您的案例像您在问题中向我们展示的那样简单,那么我不会使用诸如HTML净化器之类的外部库


函数有自己的方法来确定标记。一种不考虑<代码> 的方法,如果你的案例很简单,就像你在你的问题中展示给我们的那样,我就不会去像HTML净化器这样的外部库。


函数有自己的方法来确定标记。一种不考虑<代码>的方法,如果我理解正确,你会让用户在评论文本框中输入HTML标签吗?是的,只是因为人们复制了来自其他源的粘贴,并期望在提交时格式化看起来是相同的。主要是空格。所以这些用户使用HTML标签格式化他们的文本?我建议只使用HTML编码输入,不允许用户输入HTML。如果格式化是必须的,你可以查看富文本编辑器控件。我可以用preg_replace实现类似的效果…但这仍然有一个缺点,那就是只在标记跨越一行时才工作(我认为)。不是这样,因为可以使用一些修饰符使PHP中的正则表达式跨越多行。考虑您的正则表达式,但使用多行和不区分大小写的标记:<代码> PrggRead(‘/(??)/SIM’,”“$文本”);使用库如果我理解正确,您允许用户在评论文本框中输入HTML标记?是的,这只是因为人们从其他来源复制粘贴,并希望在提交时格式相同。大部分是空格。所以这些用户使用HTML标记格式化文本?我建议只使用HTML编码输入,而不是允许用户输入HTML。如果格式化是必须的,你可以查看富文本编辑器控件。我可以用preg_replace实现类似的效果…但这仍然有一个缺点,那就是只在标记跨越一行时才工作(我想)不是真的,因为您可以使用一些修饰符来使PHP中的正则表达式跨越多个行。考虑您的正则表达式,但是使用多行和大小不敏感的标记:<代码> PREGL替换('/((?))/SIM”,“,$ text”)。使用库我的意思是有很多标签我不允许,这就是为什么我有一个白名单而不是黑名单。我想避免使用正则表达式,但我不知道还能做什么。我的意思是有很多标签我不允许,这就是为什么我有一个白名单而不是黑名单。我想避免使用正则表达式,但我不知道怎么做不需要其他操作。此处的
m
修饰符实际上没有被使用。
m
用于
^
$
s
允许
包含新行。
m
修饰符实际上没有被使用。
m
用于
^
<a href='/link.php'> There is real Power in the Hearts of men: not just Power but "something so much powerful than Power" that Power itself begs to "power down". </a> <p class='lv'> This Power is not in the Head nor in the Intellect nor in the Skills of Man... but in the deep recess of the Human Heart... and it speaks volumes yet only very few understand its language - The Language of Love - The Greatest Power You can have.... The Power to which nothing is Impossible!!! </p> <br /> Do you know this Power? <-- Do you Speak Love???
$text = preg_replace( "~<\r([^a-zA-Z!?\s])~", "<\1", strip_tags( preg_replace( '~<([^a-zA-Z!?\s])~', "<\r\1", $text ), '<p><a><br>' ) );