我试图用文本正文中的X替换除价格(以$开头的数字)之外的所有数字。我一直试图用后面的方式来完成工作,但似乎没有用。以下是我现在使用的内容:
$comments = preg_replace("/(?<!$)([0-9]+)/", "x", $comments);
这最终只是将所有数字替换为X,包括前面带有$的数字。
答案 0 :(得分:3)
您需要使用反斜杠\$
来转义美元符号,否则会将其解释为行尾/字符串。
此外,第二个括号集完全没必要 - 您没有使用您捕获的组。
哦,为了避免更换100美元之类的东西,你需要在你的负面观察中添加0-9 ...因为你这样做,你可以简单地将美元放在角色类中并且不需要逃避。
所以在这一点上我们有:
$comments = preg_replace("/(?<![$0-9])[0-9]+/", "x", $comments);
但显然“preg_replace不支持后视中的复制” - 我认为这意味着你不能在后面放置0-9,所以在它之前放置一个单词边界。
另外要避免的是取代9.99美元,所以希望我们可以指定\ d。在后视中不允许这样做。
所以你的代码最终成为:
$comments = preg_replace("/(?<!\$|\d\.)\b[0-9]+\b/", "x", $comments);
由于所有这些增加的复杂性,您将需要创建一些测试用例以确保按预期工作。
答案 1 :(得分:2)
$
是正则表达式中的特殊字符(表示字符串的结尾)。你需要逃避它:\$
同样根据目前的制定,您的后视可能只会阻止它替换价格中的第一个数字;因为在第一个数字之后,由于你不再在$。
,所以后视将再次进行匹配您可能希望使用包含\b
(字边界)的内容来将匹配的数字序列的开头和结尾限制为仅为完整数字。
答案 2 :(得分:0)
这也应该有效:
/(?<=\s)[0-9]+/