【问题标题】:Getting count of spaces before a placeholder with regex selects too many lines在使用正则表达式的占位符之前获取空格数选择太多行
【发布时间】:2014-03-28 20:09:41
【问题描述】:

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

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

<p>Somethin before</p>

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

<p>Something after>

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

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

Debuggex Demo

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

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

如果我的问题解释得不够清楚,请评论我的问题。

【问题讨论】:

    标签: php regex templates


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      \s 简写字符类实际上等同于字符类[ \t\r\n\f] 所以它@98​​7654321@ 如果可以的话......如果你只想得到一行空格,使用这个:

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

      regex101 demo

      【讨论】:

        【解决方案3】:

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


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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多