只是一个简单的快速问题。我想用Tabs替换该行的begenning中的Double Spaces。目前我正在尝试使用preg_replace('~^( {2})~', "\t", $text)
,但只替换了第一次出现的Double Space。
- 编辑 -
preg_replace('~PATTERN~', "REPLACEMENT", " HalloWorld")
//Should be equal to "\t\t\tHallo World"
您可以使用\ G转义序列:
$var = ' Hello World'; //x4 spaces
echo preg_replace("/\G {2}/","\t",$var);
\ G标记前一个匹配结束的位置(或第一个匹配的字符串的开头);这样,第一个匹配后的所有匹配尝试从前一个匹配的字符中消耗额外的两个空格。
测试和工作:
$var = ' Hello World'; //x2 spaces
echo preg_replace("/^ {2}(.*)$/","\t$1",$var);
编辑
菲利克斯有这个力量!
echo preg_replace('~(?<![^\s]{2}) ~', "\t",$var);
如果要使用制表符替换多个双空格,请尝试以下操作:
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
我找到了没有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功能更优雅,但我不确定它的效率如何
从另一个问题回答: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中的双重空格将保持不变。
适当的解决方案
preg_replace('/^ {2}|\G {2}/Sm', "\t", $text)
替换^ {2}
行上的前2个空格,然后替换最后一次成功替换\G {2}
后的每两个空格。 \G
是最后一个替换,/S
被优化替换,因为我们将立即替换更多的事件,/m
将其视为多线字符串。
最后它会忽略所有空格,如果它们不在我理解的那一行的开头,对吧?