2015-07-13 61 views
1

之間替換字符串我不得不修改URL是這樣的:兩條斜線

$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30"; 

也就是說,我想用一個正則表達式來刪除st:1。我用:

preg_replace("/\/st:(.*)\//",'',$string) 

,但我得到了

end:2015-07-30 

,而我想獲得:

/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30 

相同的,如果我想刪除fp:1

回答

1

您需要添加?在您的正則表達式: -

<?php 

$string = "/st:1/sc:RsrlYQhSQvs=/fp:1/g:3/start:2015-07-01/end:2015-07-30"; 
echo preg_replace("/\/st:(.*?)\//",'',$string) 

?> 

輸出: - https://eval.in/397658

基於這一點,你也可以做下一件事情。

+0

謝謝。如果想要匹配這個模式,當它發生在字符串的手中時?如in/sc:r2342/st:1 – giuseppe

+0

找到。 /st:(.*?)\/|\/st:(.*?)$/ – giuseppe

+1

正如我在我的回答中指出的那樣,懶惰匹配 - '。*?' - 不推薦使用,因爲它會影響性能,並可能會超過。也許情況並非如此,在這種情況下更多的是風格問題,但這是一個重要的說明。另外,我寧願接受首先給出的正確答案。 –

3

您正在使用匹配任何字符的.的貪婪匹配。

使用更受限制的模式:

preg_replace("/\/st:[^\/]*/",'',$string) 

[^\/]*的否定字符類只匹配比/其它0或多個字符。

另一種解決方案是使用與*?量詞的延遲匹配,但與否定字符類相比效率不高。

FULL REGEX說明

  • \/st: - 字面/st:
  • [^\/]* - 0或多個字符以外/
+1

請注意,您需要刪除任何一個forwrad斜線。 –

3

您可以使用:

$string = preg_replace('~/st:[^/]*~','',$string); 

[^/]*將只匹配到明年/

0

而不是使用正則表達式在這裏你應該分析的實用功能爲您的特殊格式字符串,它們是簡單的,他們不採取長寫的,他們會讓你的生活輕鬆了許多:

function readPath($path) { 
    $parameters = array(); 

    foreach(explode('/', $path) as $piece) { 
     // Here we make sure we have something 
     if ($piece == "") { 
      continue; 
     } 

     // This here is just a fancy way of splitting the array returned 
     // into two variables. 
     list($key, $value) = explode(':', $piece); 
     $parameters[$key] = $value; 
    } 

    return $parameters; 
} 

function writePath($parameters) { 
    $path = ""; 

    foreach($parameters as $key => $value) { 
     $path .= "/" . implode(":", array($key, $value)); 
    } 

    return $path; 
} 

現在你可以在它剛剛工作作爲一個PHP數組,在這種情況下,你會去:

$parameters = readPath($string); 

unset($parameters['st']); 

$string = writePath($parameters); 

這使得更可讀和可重用的代碼,還因爲大多數的時候,你正在處理的只有輕微的變化這種格式你可以改變分隔符每次甚至將這些函數抽象爲使用不同的分隔符。


另一種方式來處理這是符合正常的路徑查詢字符串轉換,使用類似:

function readPath($path) { 
    return parse_str(strtr($path, "/:", "&=")); 
} 

你的情況,但由於您使用的是「=」字符在一個url中,你也需要對每個值進行url編碼,以免與格式衝突,但是這會涉及類似於上面的結構化代碼。