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

时间:2017-11-09 12:33:25

标签: php regex preg-replace

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

例如输入:

{% extends "workout/base.html" %}
{% load static %}
{% block footer %}
<script type="text/javascript" src="{% static js/addWorkout.js %}">
</script>
{% endblock %}

结果应为:

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

php preg_replace能实现吗?

到目前为止尝试过:

  • '/ \ d + / g' - 但它会删除所有数字而不会删除任何其他内容
  • '/(* | \ d + $)/' - 但这对某些人不起作用,导致“ROBLOX.COM 888-858 - ”

2 个答案:

答案 0 :(得分:3)

不确定这适用于其他边缘情况,但您可以尝试使用此替换:

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

demo

说明:

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

答案 1 :(得分:0)

$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