我想创建一个简单的PHP模板系统,其中HTML页面中的占位符被动态生成的内容替换。我想在动态创建的内容的开头添加每行,就像我的占位符之前一样多。问题是我的正则表达式选择的行多于一行(在占位符之前获取空格的数量;最后看图形)。
这是一个带占位符的示例模板。我需要知道 \ n 和占位符开头之间有多少空格。在这种情况下,行的开头和占位符的开头之间没有空格。
<p>Somethin before</p>
<!--#::CONTENT#-->
<p>Something after>
这是我的正则表达式,用于计算占位符之前的空格数。我创建了一个组,只给了我没有 \ n 和占位符的空格。 \ s 是一个转义空间。我不支持 TABS 。
\n(\s*)<!--#::CONTENT#-->
正如您在此示例中所看到的,选择了三行。黄色是匹配我的正则表达式的部分,橙色是我想得到的组(只有空格)。
现在我的问题:为什么这个正则表达式选择多于一行?我只允许在新行和我的占位符之间添加更多的时间。一个\ 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);
如果我的问题不够清楚,请回答我的问题。
答案 0 :(得分:1)
这是因为\s
也匹配换行符。要解决此问题,请改用\h
(对于水平空格)。
答案 1 :(得分:0)
\s
速记字符类实际上等同于字符类[ \t\r\n\f]
所以will match newlines如果它可以......如果你只想获得一行空格,请使用此:
\n( *)\s*<!--#::CONTENT#-->
答案 2 :(得分:0)
and orange is the group i want to get (only the spaces).
\s
是空白类,它包括换行符,回车符,制表符,空格等......
使用相同的正则表达式,获得空格后,你必须删除除了之外的所有内容 实际的空格,然后计算该字符串的长度以获得空间计数。