我有这样的字符串
一些字符串,其中数字模式3-9485可能会多次出现这样的另一个数字9-8465,其模式是数字和减号以及4个数字
我试过
$str="sdf sdf sd fsd f sdf ds fds fsd f dss2 fsd fsd 3-9776 sdf sd fsd sdf";
$str = preg_replace("/^[0-9]{1}-[0-9]{4}$/",'99',$str);
echo $str;
答案 0 :(得分:1)
您的模式正在寻找仅作为模式的字符串。 ^
用于字符串的开头,$
用于字符串的结尾。
使用\b
显示模式应该是自己的单词。这告诉模式在这个位置应该有一个单词边界(空格,字符串的结尾或字符串的开头)
$str = preg_replace("/\b([0-9]{1}-[0-9]{4})\b/",'{$1}99',$str);
答案 1 :(得分:1)
当您包含断言^
和$
时,您的正则表达式模式正在寻找完整匹配。它只会匹配字符串,如果它只包含连字符分隔的数字。另请注意,您需要捕获此数字才能将其附加到99.
$str = preg_replace("/([0-9]{1}-[0-9]{4})/", '${1}99', $str);
^-- capture --^ ^^^^-- backreference
如果包含模式,则匹配字符串的部分。如果您希望它仅在模式本身存在时匹配(即由空格分隔),则可以将word boundaries(\b
)添加到正则表达式。粗略地说,单词边界是单词字符(\w
)和非单词字符(\W
)之间的位置。但是,对于所有方言都不是这样。
更新的正则表达式变为:
$str = preg_replace("/\b([0-9]{1}-[0-9]{4})\b/", '{$1}99', $str);
清理一下,这可以缩短为:
$str = preg_replace("/\b(\d-\d{4})\b/", '${1}99', $str);