【发布时间】:2014-03-28 20:09:41
【问题描述】:
我想创建一个简单的 PHP 模板系统,其中 HTML 页面中的占位符被替换为动态生成的内容。我想在动态创建的内容的开头添加与占位符之前一样多的空格。问题是我的正则表达式选择的行多于一个(用于获取占位符之前的空格数;参见最后的图形)。
这是一个带有占位符的示例模板。我需要计算 \n 和占位符开头之间有多少空格。在这种情况下,行的开头和占位符的开头之间没有空格。
<p>Somethin before</p>
<!--#::CONTENT#-->
<p>Something after>
这是我用来计算占位符前有多少空格的正则表达式。我创建了一个只给我没有 \n 和占位符的空间的组。 \s 是一个转义的空格。我不支持 TABS。
\n(\s*)<!--#::CONTENT#-->
正如您在此示例中所见,选择了三行。黄色是与我的正则表达式匹配的部分,橙色是我想要获得的组(只有空格)。
现在我的问题是:为什么这个正则表达式选择的行多于一个?我只允许在新行和占位符之间有 0 个或更多 tims。之间的 \n 如何匹配正则表达式?我是否必须进行更改才能使其正常工作?
这是我在 php 页面中使用正则表达式的方式:
//THIS WILL BE THE DYNAMICALLY CREATED CONTENT OF MY PAGE
$pageContent = getIncludeContents('templates/test.php');
//THIS IS THE LAYOUT THAT IS THE SAME ON ALL PAGES
$layoutContent = getIncludeContents('templates/layout.php');
//Here I try to find how many spaces are before my placeholder
preg_match("/\\n(\\s*)<!--#::CONTENT#-->/", $layoutContent, $matches);
//Check if placeholder was found
if(count($matches) == 0 || count($matches) == 1) {
die('No MATCHES');
} else if(count($matches) == 2) {
$indent_space = $matches[1];
} else {
die('Too Many matches! BUG?');
}
//Now I add to every new line the spaces
$pageContent = str_replace("\n", "\n" . $indent_space, $pageContent);
//And finally I insert the dynamic content
echo str_replace("<!--#::CONTENT#-->", $pageContent, $layoutContent);
如果我的问题解释得不够清楚,请评论我的问题。
【问题讨论】: