我最近在应用程序上工作,允许用户创建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"><div></span>',
'<span class="div_tag"></div></span>',
'<span class="a_tag"><a></span>',
'<span class="a_tag"></a></span>',
' ',
' '
), $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+>
等等。
答案 0 :(得分:1)
使用正则表达式解析HTML是不对的。您必须考虑很多情况,并且PHP的正则表达式引擎提供了对递归模式的支持,但是当涉及到HTML时,它是一个滑坡。考虑html属性的最简单的情况是开始标记或自闭标记的这种模式:
'/<(\w)+.*?\/?>/'
类似的方法可用于关闭标记:
'/<\/(\w)+>/'
但是在这些情况下失败了:
如果要解析html标记的内部html,则需要递归模式,直到看到自己的结束标记。您可以使用对标记名称(\ w)的引用来查找结束标记。但这是地狱。即便如此,由于这么多语言与HTML一起输出,有些情况下,即使具有最具弹性的正则表达式,使用最佳模式,您也无法正确解析HTML。
但是,为了突出显示简单的HTML,上面的内容将会这样做。