【问题标题】:Search for matches and save and maybe replace it搜索匹配并保存并可能替换它
【发布时间】:2012-08-21 14:54:47
【问题描述】:

我会尽力以最好的方式解释我的问题... 好的。

我有一个这样的多行字符串:

Hello World
And again Hello <a:b:c>
And again ...

现在我想替换,但它取决于第一个字母,第二个字母等等。我有一个正则表达式 sn-p 来获取一个包含 3 个参数的数组。

arr = ('a', 'b', 'c')

现在我有一个开关来分析第一个参数。

switch (arr[0]) {
         case 'a':
              // do this
         [...]
}

如果第一个参数是我想用一些东西替换&lt;a:b:c&gt;

现在的问题是: 为了得到参数,我使用 preg_split。现在如何替换字符串的正确部分?我可以用PREG_SPLIT_OFFSET_CAPTURE 获得位置,但它是一个多行字符串,并且(!)当我用某些东西替换时,其他匹配项的位置(可能有 n 个匹配项)也必须改变,对吧?

也许你有解决这个问题的方法?

我认为 preg_replace 可以工作,但我认为这是解决此问题的错误函数,因为字母(例如第二个,b)可能是动态参数。也许我以错误的方式理解了函数 preg_replace ......但是......我真的不知道如何解决这个问题。也许你有一个文档,我可以在其中阅读一些东西来解决这个问题(请不要将我链接到 php.net - 我已经阅读过它)或者你有一个想法。

【问题讨论】:

  • 你在找preg_maybe_replace()

标签: php regex preg-replace preg-split


【解决方案1】:
// This function will replace specific matches into a new form
function RewriteText($Match)
{
  $EntireSection = $Match[0];
  $GroupOne = $Match[1];
  // ...
  return $Value;
}

$NewText = preg_replace_callback('/Hello\s+(\S+)/i', "RewriteText", $Text);

【讨论】:

  • 谢谢!这看起来很棒。我会试试(:
  • 这解决了问题,而且效果很好!感谢您的回答!我以前从未听说过这个功能 - 但现在它保存在我的脑海中。
【解决方案2】:

如果我正确理解您的问题,您想替换字符串中的文本 - 但替换完全基于匹配中找到的第一个字符?

如果正确,可以使用 PHP 的preg_replace_callback()。类似于以下的东西应该可以工作:

function replace_callback($matches) {
    switch ($matches[0]) {
        case 'a': return 'whatever';
    }
}

$str = preg_replace_callback('/<([a-z]):([a-z]):([a-z])>/ig', "replace_callback", $str);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多