我有一个像这样的字符串:
Bruce A Johnson
我希望它是
Bruce Johnson
。
如何使用 PHP 从字符串中删除单个
A
? (所有只有 1 个字符的“单词”需要删除)
类似这样的:
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'
使用explode()拆分三个单词,删除返回数组的中间元素,然后implode()重新加入字符串。
/\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 模式中的 .
不会被转义,而且,更好地处理前导空格。