我想做的是在字符串中找到问号并将其替换为 &
除了第一个。到目前为止我的代码:
$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
如何忽略 的第一次出现?
?
最佳答案
将字符串的开头匹配到第一个 ?
并使用 (*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 );
^([^?]*[?])
部分从头开始匹配字符串部分,将第一个 ?
放入第 1 组。在匿名内部我们传递匹配对象 ($m
) 的方法,我们可以在 !empty($m[1]) 的帮助下检查组是否匹配(“参与匹配”)
。如果是,我们就把它放回去。如果不匹配,则第二个分支 [?]
匹配,因此我们替换它。
关于php - 如何替换字符串中除第一个字符之外的字符的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962049/