preg_replace 除了字符串开头的所有数字和星号字符

preg_replace all digit and asterisk characters except at start of string

需要替换字符串中的所有字符,但字符串开头(或单词的一部分)除外。

例如输入:

MSFT *<E07004QY6W>
WOOLWORTHS W1157
GOOGLE*ADWS7924436927
COLES 0829
ROBLOX.COM 888-858-25
7-ELEVEN 2179
COLES EXPRESS 1896

结果应该是:

MSFT
WOOLWORTHS
GOOGLE
COLES
ROBLOX.COM
7-ELEVEN
COLES EXPRESS

可以phppreg_replace实现吗?

到目前为止尝试过:

不确定这是否适用于其他极端情况,但您可以尝试使用此替代品:

$txt = preg_replace('~^[^*\s]+(?: \pL+(?!\S))*\K.*~m', '', $txt);

demo

解释:

^[^*\s]+ 接受行首不是 space 或星号的所有内容。
(?: \pL+(?!\S))* 并最终由 space 分隔的字母组。
\K 从匹配结果中删除所有先前匹配的字符。
.* 获取将被替换的所有剩余字符。

$in = array(
    'MSFT *<E07004QY6W>',
    'WOOLWORTHS W1157',
    'GOOGLE*ADWS7924436927',
    'COLES 0829',
    'ROBLOX.COM 888-858-25',
    '7-ELEVEN 2179',
    'COLES EXPRESS 1896',
);

foreach ($in as $str) {
    echo preg_replace('/[\h*]+[^\h*]+$/', '', $str),"\n";
}

输出:

MSFT
WOOLWORTHS
GOOGLE
COLES
ROBLOX.COM
7-ELEVEN
COLES EXPRESS