preg_replace Double Spaces到一行开头的tab(\ t)

时间:2010-12-25 17:12:16

标签: php regex preg-replace

只是一个简单的快速问题。 我想用Tabs替换该行的begenning中的Double Spaces。 目前我正在尝试使用preg_replace('~^( {2})~', "\t", $text),但这只会替换第一次出现的Double Space。

- 编辑 -

preg_replace('~PATTERN~', "REPLACEMENT", "      HalloWorld")
//Should be equal to "\t\t\tHallo World"

6 个答案:

答案 0 :(得分:5)

您可以使用\ G转义序列:

$var = '    Hello    World'; //x4 spaces
echo preg_replace("/\G {2}/","\t",$var);

\ G标记上一个匹配结束的位置(或第一个匹配的字符串的开头);这样,第一个匹配后的所有匹配尝试从前一个匹配的字符中消耗额外的两个空格。

答案 1 :(得分:3)

测试和wortking:

$var = '  Hello World'; //x2 spaces

echo preg_replace("/^ {2}(.*)$/","\t$1",$var);

修改

菲利克斯有这个力量!

echo preg_replace('~(?<![^\s]{2})  ~', "\t",$var);

答案 2 :(得分:1)

如果要使用制表符替换多个双空格,请尝试以下操作:

function spaces_to_tabs($m) {
    return str_repeat("\t", strlen($m[1]) / 2);
}

$text = preg_replace_callback('~^((?: {2})+)~', 'spaces_to_tabs', $text);

如果您的文字是多行的,请将m修饰符添加到正则表达式中,以便将^视为换行符之后的起始边界(对于字符串中的每一行):

~^((?: {2})+)~m

答案 3 :(得分:1)

我找到了没有PREG功能的解决方案。

我们说我们有$str = " My Text";

我需要一个aux变量来存储一个整数:

$tmp = strlen($str) - strlen(ltrim($t3)); // If ltrim is not ok for you
                                          // You can use preg_replace()
$tmp = str_repeat("\t", $tmp / 2 /* 2 spaces -> 1 tab */) . ltrim($t3);

PREG功能更优雅,但我不确定它的效率

答案 4 :(得分:0)

从另一个问题回答:https://stackoverflow.com/a/4349514/778669

如果是来自DOMDocument的XML,它使用2个空格来缩进:

$var = '<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node>
    <anothernode>some    text</anothernode>
  </node>
</root>';

echo preg_replace_callback('/^( +)</m', function($a) { 
  return str_repeat("\t",intval(strlen($a[1]) / 2)).'<';  
}, $var);

将使用制表符替换行开头的每个双空格缩进。

所以结果是(用X代替制表符):

$var = '<?xml version="1.0" encoding="UTF-8"?>
<root>
X<node>
XX<anothernode>some    text</anothernode>
X</node>
</root>';

xml中的双重空格将保持不变。

答案 5 :(得分:0)

正确的解决方案

preg_replace('/^ {2}|\G {2}/Sm', "\t", $text)

替换行^ {2}上的前2个空格,然后替换上次成功替换后的每两个空格\G {2}\G是最后一次替换,/S已经过优化替换,因为我们要一次替换多次出现,/m将其视为多行字符串。

最后它会忽略所有空格,如果它们不在我理解的那一行的开头,对吧?