preg_replace如何改变uri的一部分

时间:2012-11-15 10:44:58

标签: php regex preg-replace

我正在尝试使用php preg_replace更改html的所有链接。 所有的uris都有以下形式

http://example.com/page/58977?forum=60534#comment-60534

我想将其更改为:

http://example.com/60534

表示删除“page”之后和“comment-”之前的所有内容,包括这两个字符串。

我尝试了以下操作,但没有返回任何更改:

$result = preg_replace("/^.page.*.comment-.$/", "", $html);

但似乎我的正则表达式语法不正确,因为它返回html不变。 你能帮帮我吗?

3 个答案:

答案 0 :(得分:6)

^是一个仅匹配字符串开头的锚点,$仅匹配最后一个。为了匹配,你不应该锚定正则表达式:

$result = preg_replace("/page.*?comment-/", "", $html);   

请注意,这可能会匹配不是网址的内容。您可能希望更具体地了解要替换的内容,例如,您可能只想替换以http:https:开头并且不包含空格的链接。

答案 1 :(得分:2)

您可能只需要这样:http://php.net/manual/en/function.parse-url.php 此函数解析URL并返回一个关联数组,该数组包含存在的URL的各种组件。

答案 2 :(得分:0)

不使用正则表达式的替代方式。

使用parse_url()

<?php    
    $url = 'http://example.com/page/58977?forum=60534#comment-60534';
    $array = parse_url($url);
    parse_str($array['query'], $query);   
    $http = ($array['scheme']) ? $array['scheme'].'://' : NULL;    
    echo $http.$array['host'].'/'.$query['forum'];
?>

演示:http://codepad.org/xB3kO588