【问题标题】:preg_replace how change part of uripreg_replace 如何改变 uri 的一部分
【发布时间】:2012-11-15 10:44:58
【问题描述】:

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

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

我想改成:

http://example.com/60534

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

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

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

但似乎我的正则表达式语法不正确,因为它返回的 html 没有改变。 你能帮我解决这个问题吗?

【问题讨论】:

    标签: php regex preg-replace


    【解决方案1】:

    ^ 是只匹配字符串开头的锚点,$ 只匹配结尾。为了匹配,你不应该锚定正则表达式:

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

    请注意,这可能会匹配非 URL 的内容。您可能希望更具体地说明将被替换的内容,例如,您可能只想替换以 http:https: 开头且不包含空格的链接。

    【讨论】:

    • 我有一个带有标题的网址列表。档案之类的东西。在我的情况下,您的代码是完美的。谢谢!
    【解决方案2】:

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

    【讨论】:

    • 这仅在字符串本身包含 URL 时才有效,而不是在您必须替换多次出现时才有效。
    【解决方案3】:

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

    使用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

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多