Php 搜索和替换子字符串中的字符

Php 搜索和替换子字符串中的字符,php,regex,preg-replace,strpos,Php,Regex,Preg Replace,Strpos,例如: “你好,我是一个[开始]字符串,我非常高兴[结束]是一个字符串…” 现在让我们假设我只想在[start]和[end]之间的子字符串中更改一些内容。我知道如何找到str_pos和到末尾的长度,但如何搜索和替换只影响此子字符串的内容 我想做的是:(例如) 将str位置5和50内的“x”替换为“y” 我知道有替代品,但那不是我想要的 任何想法都很好,非常感谢 像 <?php $string = 'my first word was first then it was the secon

例如:

“你好,我是一个[开始]字符串,我非常高兴[结束]是一个字符串…”

现在让我们假设我只想在[start]和[end]之间的子字符串中更改一些内容。我知道如何找到str_pos和到末尾的长度,但如何搜索和替换只影响此子字符串的内容

我想做的是:(例如) 将str位置5和50内的“x”替换为“y”

我知道有替代品,但那不是我想要的


任何想法都很好,非常感谢

<?php

$string = 'my first word was first then it was the second word';

echo "$string\n";
echo str_pos_replace($string, 'word', 'second', 'first', 'second') . "\n";

function str_pos_replace($string, $start, $end, $find, $replace)
{
        $pos1=strpos($string, $start);
        $pos2=strpos($string, $end);
        $subject=substr($string, $pos1, ($pos2-$pos1));
        $replaced=str_replace($find, $replace, $subject);
        return str_replace($subject, $replaced, $string);
}

下面是一个示例模式,用于查找[start]和[end]之间的字母“a”

(.*\[start\]|\[end\].*)(*SKIP)(*F)|a  
如果是字符串

str_repalce(needle, replace, haystack)
中频阵列

json_encode haystack
str_replace needle, replace, haystack)
json_decode haystack
知道str的位置对你来说没有任何价值,如果你知道你在寻找什么,你可以用其他东西来代替它,记住规则双引号使用php变量“$haystack”,单引号将完全按照你键入的“$haystack”呈现


这是替换字符串或数组中的文本或值的最简单、最好的方法,但请在使用前阅读函数文档,以便了解它们的工作原理。Json编码/解码可能是一件很难掌握的事情,但一旦你理解了它,你就可以使用它将数组转换为字符串,然后再返回,非常简单。

你可以通过回调来完成

正则表达式:

"/(?xs)^( . {" . $start_pos . "} ) ( . {" . $end_pos . "} )/"
在回调内部,对xyz的组2运行新的正则表达式替换。
返回原始组1和替换组2

未测试代码:

$start_pos = 5;
$end_pos = 50;
$str = preg_replace_callback
(
   "/(?xs)^( . {" . $start_pos . "} ) ( . {" . $end_pos . "} )/",
   function( $matches )
   {
      $orig_grp1 = $matches[1];
      $substr_replaced = preg_replace( '/xyz/', 'XYZ', $matches[2] );
      return $orig_grp1 . $substr_replaced;
   },
   $str
 );

所以,是的,我有点无聊,这可能有点过分了,但它符合你的要求:

function replaceBetweenTags($needle, $replacement, $haystack, $keepTags = false, $startTag = "[start]", $endTag = "[end]") {

    $startPattern = preg_quote($startTag);
    $endPattern = preg_quote($endTag);
    $pattern = '/'.$startPattern.'(.+)'.$endPattern.'/m';
    if (!preg_match($pattern, $haystack)) return $haystack;

    return preg_replace_callback($pattern, function($match) use ($startTag, $endTag, $keepTags, $needle, $replacement) {
        $match = str_replace($needle, $replacement, $match[0]);
        if ($keepTags) return $match;
        return str_replace($startTag, "", str_replace($endTag, "", $match));
    }, $haystack);


}
用法很简单:

echo replaceBetweenTags("happy", "sad", "Hello iam a [start] string and iam very happy with [end] beeing a string..."

// Output: Hello iam a  string and iam very sad with  beeing a string...
// Unless you set $keepTags = true, in which case it'll preserve the tags.
它还处理多个标记对。注意事项:

  • 它是区分大小写的
  • $keepTags=false
    可能会留下两个空格。您可能需要
    str\u替换那些

  • 希望有帮助。

    如果我理解正确,您希望替换子字符串中的某个内容,同时知道它在父字符串中的位置。使用
    substr()
    preg\u replace
    可以轻松完成以下操作:

    代码:

    $str = 'Hello iam a [start] string and iam very happy with [end] beeing a string...';
    
    $begpos = 12; // begin position of [start]
    $endpos = 56; // end position of [end]
    $substr = substr($str, $begpos, $endpos-$begpos);
    $subtit = preg_replace('/\iam/','I AM', $substr);
    $newstr = substr_replace($str,$subtit,$begpos,$endpos-$begpos);
    
    echo $newstr; 
    
    结果:

    Hello iam a [start] string and I AM very happy with [end] beeing a string...
    

    我把你的问题重读了好几遍。我不明白。你能试着重新措辞吗?你可以合并
    str_pos()
    str_replace()
    为什么要投票?我认为OP想要的很清楚:替换由[start]和[end]分隔的子字符串中出现的X。