代码之家  ›  专栏  ›  技术社区  ›  MultiDev

忽略字符组的php regex

php
  •  0
  • MultiDev  · 技术社区  · 7 年前

    我试图创建一个简单的函数,从路径或url中删除不必要的斜杠。我有 preg_replace 可以移除两个正斜杠,但我需要忽略它 :// ,因为这表明 http:// https:// 部分字符串:

    $string = 'http://example.com/this//that/and/the/other/file.php';
    
    echo preg_replace("/\/{2,}/", "/", $string);
    
    // Outputs: http:/example.com/this/that/and/the/other/file.php
    

    注意在 http:// 部分。如何修改此正则表达式以忽略前面有冒号的两个正斜杠?所需输出为:

    http://example.com/this/that/and/the/other/file.php
    
    3 回复  |  直到 7 年前
        1
  •  0
  •   Angel Politis    7 年前

    试着用一个否定的眼神,比如 /(?<!\:)\/+/ ,这基本上意味着 “如果前面没有冒号,则匹配1个或多个斜杠” 是的。

    代码:

    $string = 'http://example.com/this//that/and/the/other/file.php';
    
    echo preg_replace("/(?<!\:)\/+/", "/", $string);
    

    你可以看到一个活生生的例子 here 是的。

        2
  •  0
  •   Evert    7 年前

    我从一些注意事项开始:

    1. 路径中有两个斜线的url 不同于在同一位置有一个斜杠的url。即使在您的服务器上,它们可能指向同一个对象,但它不是通用的。
    2. 如果你只关心你的服务器,并且你知道这样做是安全的,你不需要寻找冒号,只是不要在url的第一部分做这样的更改。注意,相对url可以以 // 如果你把它变成一个斜线,它就会断开。您还可以用这种方式中断查询参数或片段。可能很危险。
    3. “理解”url的url解析器比草率的正则表达式要好得多。

    所以在我的回答中我用了 url parser 一个简单的 str_replace 陈述。

     $uri = \Sabre\uri\parse($input);
     if ($uri['path']) $uri['path'] = str_replace('//', '/', $uri['path']);
     $output = \Sabre\Uri\build($uri);
    
        3
  •  0
  •   Xorifelse    7 年前

    我不认为regex应该用来过滤掉整个字符串,当它是特定的时候就可以了。

    $string = 'http://example.com/this//that/and/the/other/file.php';
    $url = parse_url($string);
    $url['path'] = preg_replace('#/+#', '/', $url['path']); //The Barmar regex (essentially shorter, and thus better)
    
    echo sprintf('%s://%s%s', $url['scheme'], $url['host'], $url['path']);
    

    使用一个非常简单的regex,这应该是可行的。

    你也可以看看 http_build_url() 它的目的是从 parse_url() 但需要 pecl_http 要启用的模块或选择将未维护的函数添加为 this 是的。

    推荐文章