preg_replace仅替换匹配部分

4
我正在使用preg_replace来创建基于modrewrite的分页链接的URL。我使用以下代码: $nextURL = preg_replace('%/([\d]+)/%','/'.($pageNumber+1).'/',$currentURL); 这个方法很有效,但是我想知道是否有更好的方法,而不必在替换参数中包含'/'。我需要匹配数字位于两个/之间,因为URL有时可能包含除页面部分以外的数字。然而,这些数字从未只是数字,所以使用/[\d]+/可以防止它们被替换。
2个回答

9
你可以使用正则表达式的前后查找来实现:look-around assertions
 %(?<=/)([\d]+)(?=/)%

(?<=…) 是正向后顾断言,(?=…) 是正向先行断言。正则表达式 (?<=/)([\d]+)(?=/) 的解释如下:

  • (?<=/) – 如果当前位置前面有一个 /
  • ([\d]+) – 匹配一个或多个数字
  • (?=/) – 但仅在后面有一个 / 时匹配

你也可以将表达式简化为:

preg_replace('%(?<=/)\d+(?=/)%', $pageNumber+1, $currentURL)

表达式可以进一步简化为 %(?<=/)\d+(?=/)%,不需要在 \d 周围加上所有括号。 - Felix Kling
谢谢,我知道有这样的东西,但是我想不起来它们被叫什么或者它们是如何工作的。 - ianbarker

2

尝试

$nextURL = preg_replace('%(?<=/)([\d]+)(?=/)%',($pageNumber+1),$currentURL);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接