从字符串中删除单字母单词(以及前导或尾随空格)

问题描述 投票:0回答:3

我有一个像这样的字符串:

Bruce A Johnson

我希望它是

Bruce Johnson

如何使用 PHP 从字符串中删除单个

A
? (所有只有 1 个字符的“单词”需要删除)

php regex string replace cpu-word
3个回答
12
投票

类似这样的:

preg_replace('/\b\w\b\s?/', '', $string);

这表示删除任何两侧有单词边界以及可选尾随空格的单个单词字符。

因此

b test a test foo c
将产生
test test foo

如果您可能有一些尾随标点符号(例如

Bruce A. Johnson
),您可以使用以下表达式删除标点符号:

preg_replace('/\b\w\b(\s|.\s)?/', '', $string);
// 'b test a, test foo c' -> 'test test foo'

0
投票

使用explode()拆分三个单词,删除返回数组的中间元素,然后implode()重新加入字符串。


0
投票

/\b\w\b\s?
不会删除像
Maggie Q
这样的字符串上的残留空格。

要获得稳健的模式来删除前导空格或尾随空格,但不能同时删除两者,请使用基于可选捕获组的“条件表达式”。

实际上,如果第一个捕获组匹配为 true,则不匹配该字母后面的任何内容(这就是为什么

(1)
|
之间没有写入任何内容)。如果第一个捕获组匹配为 false,则可以选择匹配尾随空格(它可能不存在)。

代码:(演示

$array = [
    'Bruce A Johnson',
    'Maggie Q',
    'L B Johnson',
    'X',
    'F Mercury',
    'R O C K in the U S A'
];

var_export(
    preg_replace('/( )?\b\w\b(?(1)| ?)/', '', $array)
);

输出:

array (
  0 => 'Bruce Johnson',
  1 => 'Maggie',
  2 => 'Johnson',
  3 => '',
  4 => 'Mercury',
  5 => 'in the',
)

对于任何寻求一种也适合具有可选尾随点的单个字母的模式的人,那么我建议使用

/( )?\b\w\b\.?(?(1)| ?)/
而不是
/\b\w\b(\s|.\s)?/
,因为 Mark Elliots 模式中的
.
不会被转义,而且,更好地处理前导空格。

© www.soinside.com 2019 - 2024. All rights reserved.