我已经花了几个小时研究这个问题,而且无法在不破坏网址的情况下找到替换网址中的网页编号的方法。
我有这种网址:
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',$网址);
我明白了:
我尝试了很多正则表达式组合,但我对Regex没有任何经验。
问题是/ s / NUM_POST / NUM_PAGE的长度都是可变的。我需要保留第一个,并替换第二个,而不是弄乱NUM_POST或最后的博客标题。
有什么想法吗?
答案 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
s/
这是一个锚点,并不是必需的。您可以使用第二个项目启动表达式,但仍然可以获得相同的内容。我把它放在那里因为我想展示某种锚。\d+/
在这里,我们正在查找一个或多个数字,后跟正斜杠。\K
这告诉正则表达式从这里重新开始。既然我们已经成功完成了这一点,我们希望在此之后完成所有工作。 (我们做了一个匹配,但我们不想捕获它,我们只是要注意它的位置,以便我们知道从哪里开始更换。\d+
一个或多个数字。这是实际捕获的表达式的唯一部分。因此,这是将被替换的表达式的唯一部分。(?=/)
这是在捕获数字后找到斜杠的前瞻。没有捕获前瞻,所有这一切确实设置了\d+
的结尾。由于斜杠不是数字,因此它不会与\d+
匹配,而且这里也没有必要。我只是用它来展示一个锚。没有它,表达式就可以正常工作。如果没有不必要的锚点(第1项和第5项),您可以根据需要将表达式修剪为:
~\d+/\K\d+~
仍然得到相同的结果。