我正在寻找从数字没有相邻字符(包括破折号)的字符串中替换所有独立数字,例如:
测试3弦49测试49test9 9
应返回Test string 49Test 49Test9
到目前为止,我一直在玩:
$str = 'Test 3 string 49Test 49test9 9';
$str= preg_replace('/[^a-z\-]+(\d+)[^a-z\-]+?/isU', ' ', $str);
echo $str;
但是没有运气,这会返回
测试字符串9Test 9test9
遗漏了部分字符串,我想将[0-9]添加到比赛中,但无济于事,我错过了什么,看起来如此简单?
提前致谢
答案 0 :(得分:7)
尝试使用单词边界和负面环视作为连字符,例如
$str = preg_replace('/\b(?<!-)\d+(?!-)\b/', '', $str);
答案 1 :(得分:1)
如果你看空格,那就不那么复杂了:)
<?php
$str = 'Test 3 string 49Test 49test9 9';
$str = preg_replace('/(\s(\d+)\s|\s(\d+)$|^(\d+)\s)/iU', '', $str);
echo $str;
答案 2 :(得分:1)
试试这个,我试图满足你在5-abc
上不匹配的额外要求\s*(?<!\B|-)\d+(?!\B|-)\s*
和替换为单个空格!
然后问题是用字符-
扩展单词边界。我通过使用负面外观并寻找-
或\B
(不是单词边界)来实现这一目标
此外,我将周围的空白与\s*
进行匹配,因此您必须使用单个空格进行替换。
答案 3 :(得分:0)
我建议使用
explode(" ",$str)
获取字符串中“单词”的数组。那么过滤单个数字会更容易。