从字符串每行的开头移除空格

3
我有一个字符串,格式如下(请注意每个单词之间和每行开头的随机数量空格):
1 . BritishAirways 15FEB LONDON HONGKONG 2 . CathayPacific 01MAR HONGKONG SHANGHAI 3 . Qantas 12MAR SINGAPORE SYDNEY
我希望输出结果为:
1 . BritishAirways 15FEB LONDON HONGKONG 2 . CathayPacific 01MAR HONGKONG SHANGHAI 3 . Qantas 12MAR SINGAPORE SYDNEY
以下是我的代码:
$flightinfo = preg_replace('/\h+/', ' ', $flightinfo);
$flightinfo = trim($flightinfo);

$flightinfo = str_replace("\r\n\r\n","\r\n",$flightinfo);/* checks and removes double line breaks if they're there.

然而,这样做会得到以下结果,几乎正确,但是第2和第3行开头有空格。

1 .英国航空公司 15FEB 伦敦 香港
 2. 国泰航空公司 01MAR 香港 上海 
 3. 澳洲航空公司 12MAR 新加坡 悉尼 

有人知道我如何移除第2和第3行开头的空格吗?

5个回答

7
你可以使用一个正则表达式替换来实现你需要的功能:
$flightinfo = preg_replace('~^\h+|\h+$|(\R){2,}|(\s){2,}~m', '$1$2', $flightinfo);

查看正则表达式演示

详情

  • ^\h+ - 匹配行首的 1 个或多个水平空格 (^ 由于 m 修饰符匹配行首)
  • | - 或者
  • \h+$ - 匹配行尾的 1 个或多个水平空格 ($ 由于 m 修饰符匹配行尾)
  • | - 或者
  • (\R){2,} - 匹配两个或多个换行符并捕获最后一个到第 1 组中
  • | - 或者
  • (\s){2,} - 匹配两个或多个空格并捕获最后一个到第 2 组中

替换是对第 1 和第 2 组的替换反向引用。

查看 PHP 演示

$re = '/^\h+|\h+$|(\R){2,}|(\s){2,}/m';
$flightinfo = ' 1 . BritishAirways 15FEB LONDON HONGKONG


     2 . CathayPacific  01MAR     HONGKONG   SHANGHAI



  3 . Qantas   12MAR SINGAPORE SYDNEY';
$flightinfo = preg_replace($re, '$1$2', $flightinfo);
echo $flightinfo;

输出:

1 . BritishAirways 15FEB LONDON HONGKONG
2 . CathayPacific 01MAR HONGKONG SHANGHAI
3 . Qantas 12MAR SINGAPORE SYDNEY

工作得很好!但是如何不删除换行和空格? - skywind
@skywind,"new line space" 这个东西是不存在的。 - Wiktor Stribiżew
我指的是在行之间添加新的额外行(垂直)。 - skywind

2
你可以添加一个额外的语句来去除尾部的空格。
$flightinfo = preg_replace('/^\s+/m', '', $flightinfo);

2

通常你需要像这样的正则表达式:

"/\s+\s/"

使用此方法可以检测多个空格并仅替换为一个空格。

此方法可以检测换行符后的空格:

"/\n\s+/"

这个功能检测换行符前的空格:

"/\s+\n/"

双换行:

"\n+"

你可以巧妙地结合这一点来去除不需要的东西。

毕竟正则表达式只需使用 trim() 清理代码即可。


1
我建议这样做:

我建议这样做:

$flightinfo = trim(preg_replace("~\s*\R\s*~", "\n", $flightinfo));

它将任何空白序列(包括至少一个换行符\R)替换为单个换行符\n,并修剪结果。

-1

要快速从$myString的每一行开头仅删除空格

$myString = preg_replace( "/^ +/m", '', $myString );


这并没有提供问题中所述的期望输出。换句话说,这是对不同问题的正确答案。https://regex101.com/r/ieWa7r/1 另一方面,JackFuchs的答案是正确的解决方案:https://regex101.com/r/ieWa7r/2 - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接