用制表符替换空格缩进

我希望将一行开头的4个空格替换为制表符,但是当存在文本时没有更进一步 。</ p>

为了便于阅读,我的 / {4} + / </ code>或 / [] {4} + / </ code>的初始正则表达式 显然有效,但显然任何有四个空格的实例都会被替换。</ p>

  $ string ='这是一些文字 - &amp; gt;  &amp; lt;  - 这些标签或空格?'; 
$ string。=“
这是另一条单独缩进的线条”;
//我写了4个空格,一个标签,然后是4个空格,但不幸的是 它不会显示
$ string。=“
\ t这是带标签和空格的第三行”;

$ pattern ='/ [] {4} + /';
$ replace =“ \ t“;

$ new_str = preg_replace($ pattern,$ replace,$ string);

echo'&lt; pre&gt;'。 $ new_str。'&lt; / pre&gt;';
</ code> </ pre>

这是我原来的一个例子,使用正则表达式,因为表达式完全适用于 转换但是因为----&gt;&lt; ----之间的4个空格被选项卡替换。 我真的希望压缩后的文本没有改变。</ p>

到目前为止,我的最大努力是( ^ </ code>)行的开头( [] {4 } + </ code>)模式(。*?[; \ s] * </ code>)直到第一个非空格 \ s </ code> </ p>
\ n

$ pattern ='/ ^ [] {4} +。*?[; \ s] * / m'; </ code> </ p>

... 几乎可以工作但是因为压痕现在丢失了,有人能帮我理解我在这里缺少的东西吗?</ p>

[edit] </ p>

为了清楚起见,我要做的是将文本缩进的开头从空格更改为制表符,我真的不明白为什么这会让任何人感到困惑。</ p>

要清楚如下 可能(使用上面 $ string </ code>的值):</ p>

 第一行在开头有8个空格,有些文本在中间有4个空格。

我正在寻找2个标签,并且没有更改文本中的空格。

第二行在开头有4个空格。
我希望在行的开头只有1个标签。
\ 第三行 有4个空格,1个标签和4个空格。
我希望在行的开头有3个标签。
</ code> </ pre>
</ div>

展开原文

原文

I am looking to replace 4 spaces at the start of a line to tabs, but nothing further when there is text present.

My initial regex of / {4}+/ or /[ ]{4}+/ for the sake of readability clearly worked but obviously any instance found with four spaces would be replaced.

$string  = '        this is some text --&gt;    &lt;-- are these tabs or spaces?';
$string .= "
    and this is another line singly indented";
// I wrote 4 spaces, a tab, then 4 spaces here but unfortunately it will not display
$string .= "
    \t    and this is third line with tabs and spaces";

$pattern = '/[ ]{4}+/';
$replace = "\t";

$new_str = preg_replace( $pattern , $replace , $string );

echo '<pre>'. $new_str .'</pre>';

This was an example of what I had originally, using the regex given the expression works perfectly with regards to the conversion but for the fact that the 4 spaces between the ----><---- are replaced by a tab. I am really looking to have text after indentation unaltered.

My best effort so far has been (^) start of line ([ ]{4}+) the pattern (.*?[;\s]*) anything up til the first non space \s

$pattern = '/^[ ]{4}+.*?[;\s]*/m';

which... almost works but for the fact that the indentation is now lost, can anybody help me understand what I am missing here?

[edit]

For clarity what I am trying to do is change the the start of text indentation from spaces to tabs, I really don't understand why this is confusing to anybody.

To be as clear as possible (using the value of $string above):

First line has 8 spaces at the start, some text with 4 spaces in the middle.
I am looking for 2 tabs at the start and no change to spaces in the text.

Second line has 4 spaces at the start.
I am looking to have only 1 tab at the start of the line.

Third line has 4 spaces, 1 tab and 4 spaces.
I am looking to have 3 tabs at the start of the line.

dongnanman9093
dongnanman9093 也许eval.in/728521?
3 年多之前 回复
dousha1394
dousha1394 是的我想要缩进,可能是行开头的空格或制表符,只能更改为制表符。
3 年多之前 回复
donglin7383
donglin7383 所以你想维护所有的起始标签,但用标签替换所有前4个空格?
3 年多之前 回复
douquanhui5735
douquanhui5735 我担心,问题的说明有点模糊。你可以为“边缘情况”提供一些输入-输出对。
3 年多之前 回复
drau67562
drau67562 对不起,如果您没有提供准确的输入和预期的输出,我怀疑我能理解您的问题是什么。
3 年多之前 回复
dongle2627
dongle2627 嗯,我写的第三行是4个空格,一个标签和4个空格但是这似乎没有出现在stackoverflow问题中。无论哪种方式,正则表达式都停止了标签,并保留了四个尾随空格
3 年多之前 回复
dongnunai3125
dongnunai3125 您当前的输入和预期输出是多少?
3 年多之前 回复
dongshan9619
dongshan9619 这仍然没有解决第三行中间的选项卡
3 年多之前 回复
drfqfuhej48511519
drfqfuhej48511519 尝试preg_replace('〜(?:^|\G)[]{4}~m',“\t”,$s),请参阅ideone.com/EzjRYC。
3 年多之前 回复
dongmu1390
dongmu1390 我可能会错过一些东西。您的问题仅仅是用标签替换四个空格,还是还有更多?
3 年多之前 回复

2个回答



如果你不是正则表达大师,这可能对你最有意义,并且更容易适应类似的用例( 这不是最有效的代码,但它是最“可读”的imho):</ p>

  //将所有正则表达式匹配替换为应用
//给定匿名的结果 函数到$ matches array
function tabs2spaces($ s_with_spaces){
// //在其他任何事情之前,用4个空格替换现有的标签
//允许同源翻译
$ s_with_spaces = str_replace(“\ t”,'' ,$ s_with_spaces);
返回preg_replace_callback(
'/ ^([] +)/ m',
函数($ ms){
// $ ms [0] - 完全匹配
// $ ms [1] - 是第一个(...)group fron regex

// ...这里你可以添加额外的逻辑来处理
//前导空格而不是4的多个

返回str_repeat(“ \ t“,floor(strlen($ ms [1])/ 4));
},
$ s_with_spaces
);
}

//例句 e(使用点使空格可见以便解释)
$ s_with_spaces =&lt;&lt;&lt; EOS
no indent
.... 4个空格缩进
........ 8个空格缩进
EOS ;
$ s_with_spaces = str_replace('。','');
$ s_with_tabs = tabs2spaces($ s_with_spaces);
</ code> </ pre>

如果你想要一个高性能但是 相反,上面的正则表达式大师的评论中的解决方案应该有效:)</ p>


PS 通常 preg_replace_callback </ code> (和 其在Javascript中的等价物 )是结构化文本处理的伟大“瑞士军刀”。 我可耻地甚至使用它来编写解析器到迷你语言;)</ p>
</ div>

展开原文

原文

If you're not a regular expression guru, this will probably make most sense to you and be easier to adapt to similar use cases (this is not the most efficient code, but it's the most "readable" imho):

// replace all regex matches with the result of applying
// a given anonymous function to a $matches array
function tabs2spaces($s_with_spaces) {
    // before anything else, replace existing tabs with 4 spaces
    // to permit homogenous translation
    $s_with_spaces = str_replace("\t", '    ', $s_with_spaces);
    return preg_replace_callback(
        '/^([ ]+)/m',
        function ($ms) {
            // $ms[0] - is full match
            // $ms[1] - is first (...) group fron regex

            // ...here you can add extra logic to handle
            // leading spaces not multiple of 4

            return str_repeat("\t", floor(strlen($ms[1]) / 4));
        },
        $s_with_spaces
    );
}

// example (using dots to make spaces visible for explaining)
$s_with_spaces = <<<EOS
no indent
....4 spaces indent
........8 spaces indent
EOS;
$s_with_spaces = str_replace('.', ' ');
$s_with_tabs = tabs2spaces($s_with_spaces);

If you want a performant but hard to understand or tweak one-liner instead, the solutions in the comments from the regex-gurus above should work :)


P.S. In general preg_replace_callback (and its equivalent in Javascript) is a great "swiss army knife" of structured text processing. I have, shamefully, even writtent parsers to mini-languages using it ;)

douqiang5163
douqiang5163 您可以在进行转换之前简单地用空格替换所有现有选项卡,以使其在第3行上运行(如果您还想避免在后续行中使用制表符,也可以将此转换优化为基于蜜蜂正则表达式)。 我更新了我的解决方案,至少在最简单的情况下解决了这个问题。 我建议反对“monter regexes”:我在代码审查中找到它们的任何时候我要求使用更多代码(和评论)+简单正则表达式进行重写,或者在可能的情况下根本不进行重新编写,或者最坏的情况是,从中组装大型正则表达式 较小的字符串,它们之间有充足的注释 - 代码可读性首先:)
3 年多之前 回复
douwenpin0428
douwenpin0428 谢谢,不幸的是,这也不足第三行(显示2个标签然后4个空格) - 我真的更喜欢使用正则表达式,以便它将继承到其他语言。
3 年多之前 回复



我会这样做。</ p>

  $ str =“。  ..“; 
$ pattern =”'/ ^ [] {4} + /'“;
$ replace =”\ t“;

$ multiStr = explode(“
”,$ str);
$ out =“”;
foreach($ multiStr as&amp; $ line){
$ line = str_replace(“\ t”, “”,$ line);
$ out。= preg_replace($ pattern,$ replace,$ line)
}

$ results = implode(“
”,$ out);
</ code > </ pre>

请以快速直观的方式彻底重新评估代码。</ p>

因为我无法运行PHP 服务器测试它:(但应该帮助您解决这个问题。</ p>
</ div>

展开原文

原文

The way I would do it is this.

$str = "...";
$pattern = "'/^[ ]{4}+/'";
$replace = "\t"; 

$multiStr = explode("
", $str);
$out = "";
foreach ($multiStr as &$line) {
    $line = str_replace("\t", "    ",$line);
    $out .= preg_replace( $pattern , $replace , $line )
}

$results = implode("
", $out);

Please re-evaluate the code thoroughly as I have done this on a quick and intuitive way.

As I can't run a PHP server to test it :( but should help you resolved this problem.

duanlei20082008
duanlei20082008 公共PHP服务器,3v4l.org,eval.in。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问