【问题标题】:php preg_replace regex replace string between two stringphp preg_replace 正则表达式替换两个字符串之间的字符串
【发布时间】:2015-03-26 00:34:01
【问题描述】:

我有以下问题:我想替换(在 php 中)一个特殊字符,但前提是它位于其他两个字符之间。它试图使用 preg_replace 找到解决方案,但它不起作用。

我想替换每个 ;带有 : 这是在“ 例子:

$orig_string= 'asbas;"asd;";asd;asdadasd;"asd;adsas"'

结果应该是:

'asbas;"asd:";asd;asdadasd;"asd:adsas"'

我尝试了几个正则表达式,但没有任何成功...

我试过的两个例子:

$result = preg_replace('(?<=\")(.*)(;)(.*)(?=\")',':', $str);

$result = preg_replace('.*\".*(;).*\"',':', $str);

谁能帮帮我?

非常感谢

V

【问题讨论】:

  • 两个 " 之间的文本是否有一些具有特殊含义的特殊文本?因此@nu11p01n73R 的解决方案无法正常工作,因为它没有考虑到,在第一部分中可能已经是“没有追随者了;

标签: php regex replace preg-replace


【解决方案1】:

你不需要在这里使用环视。可以写成

("[^";]*);([^"]*")

替换为\1:\2

Regex Demo

测试

preg_replace ("/(\"[^\";]*);([^\"]*\")/m", "\\1:\\2", 'asbas;"asd;";asd;asdadasd;"asd;adsas"' );
=> asbas;"asd:";asd;asdadasd;"asd:adsas"

更新:

;(?!(?:"[^"]*"|[^"])*$)

只需将匹配的; 替换为:

DEMO

【讨论】:

  • :-) 没有弄错。如果您不想要,请将其还原……不,不要那样做。
  • 不是好答案。这是正确的答案,因为如果引号内出现多个分号,您的答案将失败..
  • 太好了,最后一个对我有用,这正是我要找的!!非常感谢。似乎我并不像我想的那样熟悉所有正则表达式;)我尝试使用“$1:$2”而不是双反斜杠来访问匹配项......非常感谢!跨度>
  • 嘿,您的回答对我有很大帮助,到目前为止它运行良好......我发现了一个可能的组合,该解决方案无法正常工作......我试图将您的解决方案修改为运行所有变体但没有任何成功.. 如果您有以下字符串 'asbas;asd:;asd;asdadasd;"asd:adsas' 正则表达式替换所有 ; 在双引号之前...我希望正则表达式什么都不做. 它应该只替换两个双引号内的 ;。所以我希望你能再次帮助我!非常感谢。
【解决方案2】:

字符串替换呢?

str_ireplace(';";', ':";', $orig_string);

asbas;"asd:";asd;asdadasd;"asd;adsas"

【讨论】:

  • 在编程中,一个问题没有一个解决方案,你给 10 个程序员一个问题,解决问题的方法会有所不同,结果相同,但我看到你给出了一个解决方案。用不同的方法解决问题。
  • 您的解决方案仅替换一个分号,如果它后跟一个 " 和另一个分号,但示例中的第二次出现不会被替换,因为它遵循另一种模式。
【解决方案3】:
;(?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)

试试这个。替换为:。查看演示。

https://www.regex101.com/r/bC8aZ4/16

【讨论】:

    【解决方案4】:

    一个简单易懂的解决方案是使用preg_replace_callback

    $str = preg_replace_callback('/"[^"]+"/',
           function ($m) { return str_replace(";", ":", $m[0]); },
           $str);
    

    "[^"]+" 将引用的内容捕获到$m[0],其中;: 替换

    See test at eval.in(链接即将过期)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多