搜索所有打开的HTML标记并关闭它们[PHP]

时间:2015-06-13 06:12:01

标签: php html tags

我的教堂网站上有一个名为“The Fridge”的页面,用来模仿冰箱,在那里你可以贴上便签,了解教堂里发生的事情。

您可以在此处查看:http://www.ypc.org.au/resources/fridge

因为粘滞便笺可能是各种尺寸并且信息或多或少,所以超过50个字符的信息会被省略,并且可以通过单击注释来通过模态框查看其余信息。

这工作正常,但标签不会总是正确结束。 例如,如果a< p>标签已打开,该段中的信息超过50个字符,在段落关闭之前将被截断。

这导致无效的HTML和笔记的颜色(通过css随机化)都是相同的颜色。这不是一个大问题,但拥有有效的HTML并将颜色随机化一点会很好。

我想要做的是搜索开放标记,确定打开的标记是什么,然后达到50个字符,结束检测到的所有打开标记。 我知道这并不总是一个完美的解决方案,就像标签是半开或关闭一样,用户会看到,但只需添加或删除几个单词就够了 在那些情况下。

所以我想我需要做这样的事情(但可能完全错误;也知道它混合了PHP和伪代码):

REPEAT
    $tag[x]
    Search for the "<" character
    If found {
        go to the next character and append to $tag[x] variable until ">" character is found.
        $x++
    }
UNTIL (NO MORE TAGS FOUND)

Once 50 characters reached (excluding the start tag as user wont see HTML tags), 
see if the tag has been closed.

If the tag has not been closed {
    Echo "<" . $ tag . ">" to end the tag.
}

以下是我的PHP代码如何处理一些虚假信息以避免数据库连接等的简单版本。(作为头部的文件没有转置到页面上):

http://www.ypc.org.au/fridge.zip

如果有人可以提供帮助,我们将不胜感激!它正在努力。

1 个答案:

答案 0 :(得分:3)

您可以使用DOMDocument

$yourText = "<div><span>Text<em>!";

$doc = new DOMDocument();
$doc->loadHTML($yourText, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$yourText = $doc->saveHTML();

echo $yourText;

<强>输出:

<div><span>Text<em>!</em></span></div>

修改:如果您的文字被截断并且恰好以<p>This is long text</之类的内容结束,则DOMDocument会愉快地删除该截断的标记并重建它。但是,它会引发一个关于它做了什么的警告。要取消该警告,您可以在libxml_use_internal_errors(true);之前添加loadHTML()