删除数字

时间:2017-03-08 10:54:36

标签: php regex preg-replace

我使用PHP

检索了需要格式化其中一部分的地址
$address="testbuz<br>
Test Test <br>
Test
1<br>
2fdd aa, city<br>
Belgium<br>
T: 1234567890
<br>BTW: BE-04-84-71-02-01";

我需要在 BTW 之后格式化部分 顺便说一句: BE014149111

可以有其他符号作为分隔符,例如空格星号哈希,因此需要在BE之后显示数字而没有任何空格或符号

所以输出就像

 $address="testbuz<br>
Test Test <br>
Test
1<br>
2fdd aa, city<br>
Belgium<br>
    T: 1234567890
    <br>BTW: BE0414150211";

有人知道如何用PHP做到这一点,感谢您的帮助。

注意: -

它不仅仅是破折号,它可能会有所不同,我无法替换所有地址 - 符号,它应该在BTW之后检查和替换:BE

谢谢

3 个答案:

答案 0 :(得分:2)

使用preg_replace_callback

$address="Horecaworld<br>
Test Test <br>
Test
1<br>
2911 EA, Rotterdam<br>
Belgium<br>
T: 1234567890
<br>BTW: BE-04#64/91.02|11";

$result = preg_replace_callback('/^(.+BTW: BE)(.+)$/m', function ($m) {
                        return $m[1] . preg_replace('/\D/', '', $m[2]);
                    },
                    $address);
echo $result,"\n";

<强>输出:

Horecaworld<br>
Test Test <br>
Test
1<br>
2911 EA, Rotterdam<br>
Belgium<br>
T: 1234567890
<br>BTW: BE0464910211

答案 1 :(得分:1)

这可以使用函数str_replace()strstr()来实现。试试这个:

$prefix = strstr($address, 'BTW: ', true); // Contains string until BTW: appears
$editable = strstr($address, 'BTW: '); // Contains string after BTW: appears
$editable = str_replace('-','',$editable); // Replace all occurences of - 
$result = $prefix.$editable; // Final string

答案 2 :(得分:1)

使用preg_replace和基于\G的模式:

$str = preg_replace('~(?:\G(?!\A)|BTW:\h*)[A-Z0-9]{2}\K[^A-Z0-9\r\n]~', '', $str);

demo

\G锚点匹配上一次匹配后的位置,并强制使用此分支的连续结果是连续的。
\K功能从匹配结果中删除与模式左侧部分匹配的子字符串。这样,只会删除与[^A-Z0-9\r\n]匹配的字符。

请注意,启动带有替换的模式并不是非常有效,因为正则表达式引擎需要测试字符串中每个位置的每个分支,直到其中一个分支成功为止。
但是,您可以通过一个小技巧大幅减少这项工作,以快速跳过所有没有B的子串,直到"BTW:"

~(?:\G(?!\A)|[^B]*(*SKIP)BTW:\h*)[A-Z0-9]{2}\K[^A-Z0-9\r\n]~

demo