php突出显示html标签whitin加载的html内容

时间:2014-05-06 13:34:40

标签: php html regex

我最近在应用程序上工作,允许用户创建html模板并通过复制代码来使用它。这一切都很好,但是文件太大了,大约300行的HTML代码变得难以维持某种顺序并快速找到需要替换/修复的部分代码。我看过一些用于突出显示的javascript库,但我不想要那个,我想创建一些简单的基于php的东西,仅供我使用。

到目前为止,我得到的是:

<style>
body {
    font-size:30px;
}

.div_tag {
    color:blue;
}
.a_tag {
    color:green;
}
</style>

<body>
<?php
ob_start();
include 'content.php';
$source = ob_get_contents();
ob_end_clean();

$all_lines = explode("\n", $source);

foreach($all_lines as $line) {
    echo preg_replace(array(
        '/<div>/',
        '/<\/div>/',
        '/<a>/',
        '/<\/a>/',
        '/    /',
        '/        /'
    ), array(
        '<span class="div_tag">&lt;div&gt;</span>',
        '<span class="div_tag">&lt;/div&gt;</span>',
        '<span class="a_tag">&lt;a&gt;</span>',
        '<span class="a_tag">&lt;/a&gt;</span>',
        '&nbsp;&nbsp;&nbsp;&nbsp;',
        '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'
    ), $line) . '<br />';
}
?>
</body>

为了测试目的,content.php文件如下所示:

<div>
    <div>
        <a>Source</a>
    </div>
</div>

现在,问题我有,首先,最重要的是,我想知道是否有办法处理标签,因为我必须输入字面上4个空格而不是标签,使它看起来像有一个标签在line,经典标签没有正确解析,它刚刚消失,在这种情况下没有标签或空格,这是非常有问题的。

我遇到的第二个问题是使用html标签,在这个基本示例中它可以正常工作但是如果我执行类似<img src="sth" />或甚至<a href="sth">sth</a>的操作,它显然会中断,我认为它应该在正则表达式中编码更多准确地说,但是因为我刚开始学习正则表达式,所以我不知道如何处理它。

目前我刚刚准备了<div><a>,但如果我了解如何让它更具有可添加性,我将包含更多内容,例如<img><span>,{{1} },<h1,2,3+>等等。

1 个答案:

答案 0 :(得分:1)

使用正则表达式解析HTML是不对的。您必须考虑很多情况,并且PHP的正则表达式引擎提供了对递归模式的支持,但是当涉及到HTML时,它是一个滑坡。考虑html属性的最简单的情况是开始标记或自闭标记的这种模式:

'/<(\w)+.*?\/?>/'

类似的方法可用于关闭标记:

'/<\/(\w)+>/'

但是在这些情况下失败了:

  • 有&#34;&gt;&#34;属性值中的符号(特别是如果是javascript事件处理程序)
  • 您也想解析内部HTML

如果要解析html标记的内部html,则需要递归模式,直到看到自己的结束标记。您可以使用对标记名称(\ w)的引用来查找结束标记。但这是地狱。即便如此,由于这么多语言与HTML一起输出,有些情况下,即使具有最具弹性的正则表达式,使用最佳模式,您也无法正确解析HTML。

但是,为了突出显示简单的HTML,上面的内容将会这样做。