替换url中的页码(php)

时间:2014-03-17 20:07:52

标签: php regex url preg-replace

我已经花了几个小时研究这个问题,而且无法在不破坏网址的情况下找到替换网址中的网页编号的方法。

我有这种网址:

  

http://example.com/s/192090/1/text

其中" 192090"是帖子ID,1是页码,"文字"是帖子标题。

我想要的是更换页码,保留网址的其余部分:

  

http://example.com/s/192090/2/text

     

http://example.com/s/192090/3/text

     

http://example.com/s/192090/12/text

     

http://example.com/s/192090/542/text

等等。

问题是,我无法正确使用正则表达式。

如果我尝试:

  

的preg_replace(" / [0-9] + / [0-9] + /"' $ 0/2',$网址);

我明白了:

  

http://example.com/s/192090/1/2/text

我尝试了很多正则表达式组合,但我对Regex没有任何经验。

问题是/ s / NUM_POST / NUM_PAGE的长度都是可变的。我需要保留第一个,并替换第二个,而不是弄乱NUM_POST或最后的博客标题。

有什么想法吗?

5 个答案:

答案 0 :(得分:1)

这是有效的,不需要处理背面引用,这让我的头部受伤:

$url = '/s/192090/1/2/text';
$page_number = 55;
$pattern = '/\/(s)\/(\d+)\/(\d+)\/(.*)/';
$replacement = '/$1/$2/'.$page_number.'/$4';

echo preg_replace($pattern, $replacement, $url);

但是,它假定您具有可以更改为:

的前导/s/
'/\/(.*)\/(\d+)\/(\d+)\/(.*)/'

答案 1 :(得分:0)

使用分组((..))和对该组的反向引用:

$newUrl = preg_replace('#s/([0-9]+)/[0-9]+#', 's/\1/' . $newPageNr, $url);

\1表示第一组。

答案 2 :(得分:0)

为什么不尝试使用explode()

$example  = "http: //example.com/s/192090/1/text";
$info = explode("/", $example);
$pid = $info[4];
$page = $info[5];
$text = $info[6];

答案 3 :(得分:0)

这是另一种方法,通过爆炸和爆炸:

$url = "http://example.com/s/192090/1/text";
$parsed = parse_url($url); //generate associative array
$exploded = explode("/", $parsed['path']); //explodes path

//replaces the crucial number
$exploded[3] = 7;

$parsed['path'] = implode("/", $exploded);//recreates the path
//concatenates the URL - may also be able to use http_build_url here
$newURL = $parsed['scheme']  ."://" . $parsed['host'] . $parsed['path']; 
echo $newURL;

答案 4 :(得分:0)

以下是我做的替换:

$new_digit = 1978;

$url = 'http://example.com/s/192090/1/text';

print "Original URL: ".$url;

$url = preg_replace('~s/\d+/\K\d+(?=/)~', $new_digit, $url);

print "\n     New URL: ".$url;

输出:

Original URL: http://example.com/s/192090/1/text
     New URL: http://example.com/s/192090/1978/text

以下是REGEX的解释:

s/   \d+/   \K    \d+    (?=/)
^      ^     ^     ^       ^
1      2     3     4       5
  1. s/这是一个锚点,并不是必需的。您可以使用第二个项目启动表达式,但仍然可以获得相同的内容。我把它放在那里因为我想展示某种锚。
  2. \d+/在这里,我们正在查找一个或多个数字,后跟正斜杠。
  3. \K这告诉正则表达式从这里重新开始。既然我们已经成功完成了这一点,我们希望在此之后完成所有工作。 (我们做了一个匹配,但我们不想捕获它,我们只是要注意它的位置,以便我们知道从哪里开始更换。
  4. \d+一个或多个数字。这是实际捕获的表达式的唯一部分。因此,这是将被替换的表达式的唯一部分。
  5. (?=/)这是在捕获数字后找到斜杠的前瞻。没有捕获前瞻,所有这一切确实设置了\d+的结尾。由于斜杠不是数字,因此它不会与\d+匹配,而且这里也没有必要。我只是用它来展示一个锚。没有它,表达式就可以正常工作。
  6. 如果没有不必要的锚点(第1项和第5项),您可以根据需要将表达式修剪为:

    ~\d+/\K\d+~
    

    仍然得到相同的结果。

    Here is a working demo