php - 如何替换字符串中除第一个字符之外的字符的出现

标签 php regex preg-replace

我想做的是在字符串中找到问号并将其替换为 & 除了第一个。到目前为止我的代码:

$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 );

参见 this IDEONE demo

^([^?]*[?]) 部分从头开始匹配字符串部分,将第一个 ? 放入第 1 组。在匿名内部我们传递匹配对象 ($m) 的方法,我们可以在 !empty($m[1]) 的帮助下检查组是否匹配(“参与匹配”) 。如果是,我们就把它放回去。如果不匹配,则第二个分支 [?] 匹配,因此我们替换它。

关于php - 如何替换字符串中除第一个字符之外的字符的出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37962049/

相关文章:

php - 将函数从 Javascript 转换为 PHP

PHP/Propel删除记录1 :n

javascript - 在替换中使用匹配

JavaScript 正则表达式匹配句子中的单词

php - 用于拆分所有未转义分号的正则表达式

php - 查找并替换可能部分位于 html 标记内的字符串

php: 从表单元素中读取属性

php - 在 PHP 中格式化 HTML 代码

php - 为什么消息没有回显?

Asp.Net 如何获取正则表达式的字符串结果,而不仅仅是一个