【问题标题】:preg_replace all digit and asterisk characters except at start of stringpreg_replace 除了字符串开头的所有数字和星号字符
【发布时间】:2017-11-09 12:33:25
【问题描述】:

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

例如输入:

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

php preg_replace 可以实现这个吗?

到目前为止尝试过:

  • '/\d+/g' - 但它会删除所有数字,仅此而已
  • '/(*|\d+$)/' - 但这对某些人不太有效,导致“ROBLOX.COM 888-858-”

【问题讨论】:

  • 请用您迄今为止尝试过的内容更新问题。
  • 先看看这个:([a-zA-Z0-9\.\-]+).+\nregex101.com/r/EtgztL/1 问题是匹配“COLES EXPRESS”而不匹配“WOOLWORTHS W1157”。
  • 是的,preg_replace 可以使用正确的正则表达式来做到这一点。

标签: php regex preg-replace


【解决方案1】:

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

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

demo

解释:

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

【讨论】:

  • 不错!谢谢。
【解决方案2】:
$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

【讨论】:

    猜你喜欢
    • 2012-04-10
    • 2014-04-07
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多