【问题标题】:For every line beginning with 4 spaces, add text-indent tags对于以 4 个空格开头的每一行,添加 text-indent 标签
【发布时间】:2012-01-17 09:44:28
【问题描述】:

我有一些行缩进 4 个空格的文本。我一直在尝试编写一个正则表达式,它会找到以 4 个空格开头的每一行,并在开头放一个 <span class="indented">,在结尾放一个 </span>。不过,我还不擅长正则表达式,所以它一无所获。有办法吗?

(我正在使用 PHP,以防有比正则表达式更简单的选项)。

例子:

Text text text
    Indented text text text
More text text text
A bit more text text.

到:

Text text text
<span class="indented">Indented text text text</span>
More text text text
A bit more text text.

【问题讨论】:

    标签: php regex indentation


    【解决方案1】:

    以下将匹配以至少 4 个空格或制表符开头的行:

    $str = preg_replace("/^(?: {4,}|\t *)(.*)$/m", "<span class=\"indented\">$1</span>", $str);
    

    【讨论】:

    • 我觉得说 (?: {4}|\t) 更有表现力。可以更轻松地确定您实际定位的空间数量。 (甚至可能只是去 \s{4})
    • 太棒了!非常感谢。这比我能理解的要复杂得多的正则表达式,但效果很好。
    • @RC.: \s{4} 是可能的,但这意味着至少需要匹配 4 个制表符才能正常工作,这似乎不切实际。
    • 我的意思是作为第一部分的替代品。你仍然会离开 |\t。我只是懒惰,没有再把整件事写出来。 :)
    【解决方案2】:

    我必须做类似的事情,我可能会建议的一件事是将目标格式更改为

    <span class="tab"></span>Indented text text text
    

    然后你可以设置你的 css 像 .tab {width:4em;} 这样而不是使用 preg_replace 和正则表达式,你可以这样做

    str_replace($str, "    ", "<span class='tab'></span>");
    

    这样做的好处是允许 8 个空格轻松变成双宽制表符。

    【讨论】:

    • span是内联元素,不受width:影响
    • 这也是一个想法......它可以与内联 div 一起使用。似乎比拖出正则表达式要简单一些。
    • 你说得对,你还得把跨度设为display:inline-block;
    【解决方案3】:

    我认为这应该可行:

    //get each line as an item in an array
    $array_of_lines = explode("\n", $your_string_of_lines);
    
    foreach($array_of_lines as $line) {
        // First four characters
        $first_four = substr($line, 0, 4);
        if($first_four == '    ') {
            $line = trim($line);
            $line = '<span class="indented">'.$line.'</span>'; 
        }
    
        $output[] = $line;
    }
    
    echo implode("\n",$output);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多