2010-11-04 32 views
6

thể trùng lặp:
Change single variable value in querystringphp - thêm/cập nhật một tham số trong một url

tôi tìm thấy chức năng này để thêm hoặc cập nhật một tham số để một url nào đó, nó hoạt động khi tham số cần phải được thêm vào, nhưng nếu tham số tồn tại nó không thay thế nó - xin lỗi tôi không biết nhiều về regex ai cũng có thể có một cái nhìn:

function addURLParameter ($url, $paramName, $paramValue) { 
    // first check whether the parameter is already 
    // defined in the URL so that we can just update 
    // the value if that's the case. 

    if (preg_match('/[?&]('.$paramName.')=[^&]*/', $url)) { 

     // parameter is already defined in the URL, so 
     // replace the parameter value, rather than 
     // append it to the end. 
     $url = preg_replace('/([?&]'.$paramName.')=[^&]*/', '$1='.$paramValue, $url) ; 
    } else { 
     // can simply append to the end of the URL, once 
     // we know whether this is the only parameter in 
     // there or not. 
     $url .= strpos($url, '?') ? '&' : '?'; 
     $url .= $paramName . '=' . $paramValue; 
    } 
    return $url ; 
} 

đây là một ví dụ về những gì không làm việc:

http://www.mysite.com/showprofile.php?id=110&l=arabic 

nếu tôi gọi addURLParameter với l = tiếng anh, tôi nhận được

http://www.mysite.com/showprofile.php?id=110&l=arabic&l=english 

cảm ơn trước.

+0

Chức năng có vẻ ổn với tôi. Bạn có thể đưa ra một ví dụ về một tham số mà bạn đang cố thay thế hay không và kết quả bạn đang nhận được là gì? –

+0

@Bruce Alderman được thêm vào ví dụ. –

+0

Tôi không chắc chắn những gì sai; Tôi đã chạy một vài thử nghiệm ở đây và không thể tạo lại lỗi. Bất kể, nếu bạn không hiểu các biểu thức thông thường, chúng sẽ không phải là giải pháp tốt nhất. Điều gì sẽ xảy ra khi bạn cần duy trì mã? –

Trả lời

18

Tại sao không sử dụng các hàm PHP chuẩn để làm việc với URL?

function addURLParameter ($url, $paramName, $paramValue) { 
    $url_data = parse_url($url); 
    $params = array(); 
    parse_str($url_data['query'], $params); 
    $params[$paramName] = $paramValue; 
    $params_str = http_build_query($params); 
    return http_build_url($url, array('query' => $params_str)); 
} 

Xin lỗi không để ý http_build_url đó là PECL :-) Hãy cuộn build_url chức năng riêng của chúng tôi sau đó.

function addURLParameter($url, $paramName, $paramValue) { 
    $url_data = parse_url($url); 
    if(!isset($url_data["query"])) 
     $url_data["query"]=""; 

    $params = array(); 
    parse_str($url_data['query'], $params); 
    $params[$paramName] = $paramValue; 
    $url_data['query'] = http_build_query($params); 
    return build_url($url_data); 
} 


function build_url($url_data) { 
    $url=""; 
    if(isset($url_data['host'])) 
    { 
     $url .= $url_data['scheme'] . '://'; 
     if (isset($url_data['user'])) { 
      $url .= $url_data['user']; 
       if (isset($url_data['pass'])) { 
        $url .= ':' . $url_data['pass']; 
       } 
      $url .= '@'; 
     } 
     $url .= $url_data['host']; 
     if (isset($url_data['port'])) { 
      $url .= ':' . $url_data['port']; 
     } 
    } 
    $url .= $url_data['path']; 
    if (isset($url_data['query'])) { 
     $url .= '?' . $url_data['query']; 
    } 
    if (isset($url_data['fragment'])) { 
     $url .= '#' . $url_data['fragment']; 
    } 
    return $url; 
} 
+0

cảm ơn nhưng tôi đang ở trên một máy chủ chia sẻ không có PECL –

+0

Đã thêm biến thể không PECL – Qwerty

+0

@Sherif, anh ấy đã cập nhật câu trả lời của mình. 1, điều này là tốt (mặc dù nó phải là trong câu hỏi ban đầu và không ở đây trong bản sao, vì lợi ích của các thế hệ tương lai) –

Các vấn đề liên quan