匹配字符串到第一?
的開始和使用(*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])
的幫助下檢查組匹配(「參與匹配」)。如果是這樣,我們就把它放回去。如果沒有,第二個分支匹配[?]
,所以我們將其替換。
正是我一直在尋找。謝謝 – Roman
非常好的解釋 – Roman
如果你想,你可以閱讀更多關於['*(跳過)(*失敗)'這裏](http://stackoverflow.com/questions/24534782/how-do-skip-or- F-工作的正則表達式) –