【问题标题】:(PHP) - Changing two substrings inside a string(PHP) - 更改字符串中的两个子字符串
【发布时间】:2011-01-12 13:42:07
【问题描述】:

这是我的大字符串

开始:事件
UID:xxxxxx
DTSTAMP:xxxxxx
状态:已确认
类:公共
网址:xxxxxx
摘要:YYYYYY
描述:xxxxxx; YYYYYY;
DTSTART:xxxxxx
DTEND:xxxxxx
地理位置:xxxxxx
位置:xxxxxx
结束:VEVENT

我需要改变SUMMARY/DESCRIPTION中两个“YYYYYYY”的位置

我必须在没有具体说明的情况下替换它们,因为它是在一个更大的函数中实现的。 (此字符串已从 3700 行中切出 - 日历)

【问题讨论】:

  • 你说的更改位置是什么意思,不具体的替换它们是什么意思
  • 我记得我用kigkonsult.se/iCalcreator 来解析/创建/编辑/保存ToDB iCal 文件;)

标签: php string substring


【解决方案1】:

我会使用带有替换方法的正则表达式替换。

rexex 应该有 2 个字符串的子选择,然后您可以在 replace 方法中构建段并替换它的大部分。

/SUMMARY:(.+?).*?DESCRIPTION:.*?; (.+);

http://www.php.net/manual/en/function.preg-replace-callback.php

【讨论】:

    【解决方案2】:

    找到“SUMMARY:”和“DESCRIPTION:”的位置 并替换为位置。

    找到这些位置之间的字符串并替换该字符串

    【讨论】:

      【解决方案3】:

      这取决于您所说的“具体”是什么意思。如果您需要替换特定键中的值(例如,您知道要替换键“SUMMARY”和“DESCRIPTION”的值),那么只需使用正则表达式或将字符串转换为一个数组并替换值,如下所示:

       //assuming $str is your string
      $lines = explode("\n", $str);
      foreach($lines as $k => $line)
      {
         $parts = explode(":", $line);
         if ($parts[0] == 'SUMMARY') $lines[$k] = $parts[0].':'.'REPLACE_VALUE_FOR_SUMMARY';
         else if ($parts[0] == 'DESCRIPTION') $lines[$k] = $parts[0].':'.'REPLACE_VALUE_FOR_DESC';
      }
      $str = implode("\n", $lines);
      

      正则表达式版本应该是这样的:

      $str = preg_replace('/(SUMMARY:)(.+)/', '$1:NEWVALUE', $str);
      $str = preg_replace('/(DESCRIPTION:)(.+)/', '$1:NEWVALUE', $str);
      

      【讨论】:

      • 唯一的问题是我需要先获取这两个值...我不只是想为它们设置新值。相反,我想交换他们的价值观。 (摘要值 描述值)
      • 这涉及到首先读取值然后设置它们。在我编写的第二个示例中(使用 preg_replace):首先执行 preg_match('/SUMMARY:(.+)/', $str, $matches); $summary_value = $matches[1];然后相同的描述,然后使用 preg_replace 调用中的值
      猜你喜欢
      • 2013-01-31
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 2018-11-04
      相关资源
      最近更新 更多