我会尽力以最好的方式解释我的问题...... 好的。
我有一个这样的多行字符串:
Hello World
And again Hello <a:b:c>
And again ...
现在我想要替换,但它取决于第一个字母,第二个字母等等。我有一个正则表达式片段来获取一个包含3个参数的数组。
arr = ('a', 'b', 'c')
现在我有一个分析第一个参数的开关。
switch (arr[0]) {
case 'a':
// do this
[...]
}
如果第一个参数是a,我想用某些东西替换<a:b:c>
。
现在的问题是:
要获取参数,我使用preg_split。它现在怎么可能替换正确的字符串部分?我可以用PREG_SPLIT_OFFSET_CAPTURE
获得位置,但是它是一个多行字符串,而(!)当我用其他匹配的位置替换时(可能有n个匹配)也必须改变,对吧?
也许你有解决方案来解决这个问题?
我认为preg_replace可以工作,但我认为这是解决这个问题的错误函数,因为一个字母(例如第二个{{1}})可以是一个动态的参数。也许我以错误的方式理解了函数preg_replace ......但是......我真的不知道如何解决这个问题。也许你有一个文档,我可以阅读一些东西来解决这个问题(请不要把我链接到php.net - 我已经读过它)或者你有一个想法。
答案 0 :(得分: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);
答案 1 :(得分:0)
如果我正确理解你的问题,你想要替换字符串中的文本 - 但替换完全基于匹配中找到的第一个字符?
如果这是正确的,您可以使用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);