这个答案完全从字面上理解了这个问题:它仅与空格和制表符有关。当然,OP 可能还希望在修剪/压缩的内容中包含其他类型的空白,但我们假设他想保留嵌入的 CR 和/或 LF .
首先,让我们设置一些常量。如果需要进行修改,这将便于理解和维护。我放了一些额外的空格,以便您可以更轻松地比较异同。
define( 'S', '[ \t]+' ); # Stuff you want to compress; in this case ONLY spaces/tabs
define( 'L', '/\A'.S.'/' ); # stuff on the Left edge will be trimmed
define( 'M', '/'.S.'/' ); # stuff in the Middle will be compressed
define( 'R', '/'.S.'\Z/' ); # stuff on the Right edge will be trimmed
define( 'T', ' ' ); # what we want the stuff compressed To
我们使用\A 和\Z escape characters 来指定主题的开始和结束,而不是典型的^ 和$,它们是面向行的meta-characters。这与其说是因为在这种情况下需要它们,不如说是“防御性”编程,如果S 的值发生变化以使它们在未来被需要的话。
现在是秘诀:我们将利用preg_replace 的一些特殊语义,即(已添加重点)
如果替换 array 中的元素少于模式数组中的元素,则任何多余的模式都将替换为空字符串。
function trim_press( $data ){
return preg_replace( [ M, L, R ], [ T ], $data );
}
因此,我们使用的是模式数组和替换数组,而不是模式字符串和替换字符串,这会导致多余的模式 L 和 R 被修剪。