2010-11-17 57 views
-3

我正在寻找替换所有出现的空行字符跟随新行(或在开始时发生的输入字符串)。我知道我可以使用preg_replace_callback()和使用str_repeat和strlen的回调来实现这一点,或者类似地使用/ e开关;但想知道是否可以做得更简单。PHP中的preg_replace() - 替换出现n次出现的字符时出现n次出现的另一个字符时,跟随一个新行

目前,我有以下几点:

$testData = " Hello\n to everybody\n in the world"; 
echo preg_replace('/^|\n()+/', ' ', $pValue); 

这给:

"  Hello to everybody in the world" 

我真的什么后:

"  Hello\n to everybody\n   in the world" 

回答

1

在提问之前,我应该更加努力地搜索:找到似乎完美工作的答案(对于java解决方案)。为了其他有同样问题的人,我会在这里留下解决方案。

$testData = " Hello\n to everybody\n in the world"; 
echo preg_replace('/(?m)(?:^|\\G) /', ' ', $pValue); 

现在只需要确定是否旧版本的PHP支持这一点。

+0

年龄多大? 'preg_ *'函数一直由PCRE库提供支持,根据其更新日志,PCRE自2003年2月4.0版以来支持'\ G'。 ref:http://www.pcre.org/changelog.txt – 2010-11-18 03:25:28

+0

@Alan - 我完全不熟悉\ G运算符,并且知道PHP已经引入了许多新的regexp元素/开关随着时间的推移。这是为了提高性能,在一个开源库中:我主要关注5.2.0(我通常不会提供对此的支持),但知道库的某些用户正在使用PHP的版本早在5.1.6 – 2010-11-18 09:31:16

0

您可以使用递归

$pValue = " Hello\n to everybody\n in the world"; 
echo myReplace($pValue); 

function myReplace($value) 
{ 
    $value = preg_replace('/(^|\\n)(( )*) /', '\1\2 ', $value); 
    if (preg_match('/(^|\\n)(( )*) /', $value)) 
    { 
     $value = myReplace($value); 
    } 
    return $value; 
} 
相关问题