2016-06-22 61 views
2

我想要做的是在字符串中查找問號,並用&(第一個字符除外)替換它。到目前爲止我的代碼:如何替換字符串中除第一個字符以外的字符的發生

$str = 'www.domain.com?adult=2&airport=40-48?destination=recko';   
    echo preg_replace(array('/[?]/'), '&', $str); 

輸出:

www.domain.com&adult=2&airport=40-48&destination=recko 

我怎麼能夠無視?第一次出現的?

回答

4

匹配字符串到第一?的開始和使用(*SKIP)(*F)省略第一場比賽:

$str = 'www.domain.com?adult=2&airport=40-48?destination=recko';   
echo preg_replace('/^[^?]*\?(*SKIP)(*F)|[?]/', '&', $str); 
// => www.domain.com?adult=2&airport=40-48&destination=recko 

IDEONE demo

圖案的詳細資料

  • ^ - 字符串的開頭
  • [^?]* - 比其他0+字符?儘可能多的
  • \? - 字面?
  • (*SKIP)(*F) - 兩個PCRE動詞使得正則表達式引擎忽略當前迭代到目前爲止所匹配的文本
  • | - 或
  • [?] - 字面?

替代(*SKIP)(*FAIL)是使用preg_replace_callback並與第一選擇分支前圖案捕獲括號內:

$str = 'www.domain.com?adult=2&airport=40-48?destination=recko';   
echo preg_replace_callback('/^([^?]*[?])|[?]/', function($m) { 
    return !empty($m[1]) ? $m[1] : "&"; 
}, $str); 

this IDEONE demo

^([^?]*[?])部分字符串的一部分從一開始會在第一?匹配並放置到組1中。在通過匹配對象($m)的匿名方法中,我們可以在!empty($m[1])的幫助下檢查組匹配(「參與匹配」)。如果是這樣,我們就把它放回去。如果沒有,第二個分支匹配[?],所以我們將其替換。

+1

正是我一直在尋找。謝謝 – Roman

+0

非常好的解釋 – Roman

+0

如果你想,你可以閱讀更多關於['*(跳過)(*失敗)'這裏](http://stackoverflow.com/questions/24534782/how-do-skip-or- F-工作的正則表達式) –

0

不知道這是否是最乾淨的方式,但會工作,很容易:

echo substr($str,0,1) . preg_replace(array('/[?]/'), '&', substr($str,1)); 
1

我們只是循環認爲整個字符串找到第一個?並用&替換每一個。無需使用正則表達式是緩慢

<?php 
$str = 'www.domain.com?adult=2&airport=40-48?destination=recko';  

$strlen = strlen($str); 
$passed_first = false; 

for($i = 0; $i < $strlen; $i++) { 
    if($str[$i] == "?") { 
     if(!$passed_first) { 
      $passed_first = true; 
     } else { 
      $str[$i] = "&"; 
     } 
    } 
} 

echo $str; 
0

最好的辦法是,我認爲是做explode("?",$str)explode("&",$str),並把它們放在一個陣列,並在那裏你拿第一?和休息你忽略了小的,如果條件做preg_replace()並做array_marge()

嘗試,讓我知道

0

請參見第parse_url

有了這個,你可以很容易地提取URL的一部分,做串您感興趣

<?php 

$str = 'www.domain.com?adult=2&airport=40-48?destination=recko'; 

$url = parse_url($str); 
$url['query'] = str_replace('?', '&', $url['query']); 

echo $url['path'] . '?' . $url['query']; 
相關問題