在带有正则表达式的占位符之前计算空格数会选择太多行

时间:2014-03-28 20:09:42

标签: php regex templates

我想创建一个简单的PHP模板系统,其中HTML页面中的占位符被动态生成的内容替换。我想在动态创建的内容的开头添加每行,就像我的占位符之前一样多。问题是我的正则表达式选择的行多于一行(在占位符之前获取空格的数量;最后看图形)。

这是一个带占位符的示例模板。我需要知道 \ n 和占位符开头之间有多少空格。在这种情况下,行的开头和占位符的开头之间没有空格。

<p>Somethin before</p>

<!--#::CONTENT#-->

<p>Something after>

这是我的正则表达式,用于计算占位符之前的空格数。我创建了一个组,只给了我没有 \ n 和占位符的空格。 \ s 是一个转义空间。我不支持 TABS

\n(\s*)<!--#::CONTENT#-->

Regular expression visualization

Debuggex Demo

正如您在此示例中所看到的,选择了三行。黄色是匹配我的正则表达式的部分,橙色是我想得到的组(只有空格)。

Example of my template

现在我的问题:为什么这个正则表达式选择多于一行?我只允许在新行和我的占位符之间添加更多的时间。一个\ 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);

如果我的问题不够清楚,请回答我的问题。

3 个答案:

答案 0 :(得分:1)

这是因为\s也匹配换行符。要解决此问题,请改用\h(对于水平空格)。

答案 1 :(得分:0)

\s速记字符类实际上等同于字符类[ \t\r\n\f]所以will match newlines如果它可以......如果你只想获得一行空格,请使用此:

\n( *)\s*<!--#::CONTENT#-->

regex101 demo

答案 2 :(得分:0)

and orange is the group i want to get (only the spaces).


\s是空白类,它包括换行符,回车符,制表符,空格等......

使用相同的正则表达式,获得空格后,你必须删除除了之外的所有内容 实际的空格,然后计算该字符串的长度以获得空间计数。