我使用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
谢谢
答案 0 :(得分:2)
$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);
\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]~