在子字符串中搜索和替换字符

时间:2014-09-14 22:17:32

标签: php regex preg-replace strpos

示例:

“你好iam一个[开始]字符串,我很高兴[结束]一个字符串......”;

现在假设我只想改变[start]和[end]之间子串的内容。我知道如何找到str_pos和lenght到底,但我如何搜索和替换只影响这个子串的东西?

我想做的是:(例如) 在str positon 5和50

中将'x'替换为'y'

我知道有substr_replace但这不是我想要的。

任何想法都会很棒,非常感谢!

6 个答案:

答案 0 :(得分:1)

如果我理解正确,你想要在子串中替换某些内容,同时知道它在父字符串中的位置。使用substr()preg_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...

答案 1 :(得分:0)

怎么样......

<?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);
}

将打印出类似的内容:

  

我的第一个字首先是第二个字

     

我的第一个单词是第二个,然后是第二个单词

答案 2 :(得分:0)

这是一个示例模式,用于查找字母&#39; a&#39;在[开始]和[结束]之间

(.*\[start\]|\[end\].*)(*SKIP)(*F)|a  

Demo

答案 3 :(得分:0)

如果是字符串

str_repalce(needle, replace, haystack)

如果是数组

json_encode haystack
str_replace needle, replace, haystack)
json_decode haystack

如果你知道你在寻找什么,那么知道str位置对你来说真的很有价值你可以用其他东西替换它只记得规则双引号使用php vars“$ haystack”和单引号将完全按照您输入'$ haystack'

进行渲染

这是迄今为止用于替换字符串或数组中的文本或值的最简单方法和最佳方法,但请在使用前阅读这些函数的文档,以便了解它们的工作原理。 Json_encode / Decode可能是一个难以掌握的东西,但是一旦你理解了它,你就可以用它来将你的数组转换为字符串,然后再轻松回复。

答案 4 :(得分:0)

你可以通过回调来做到这一点。

正则表达式:

"/(?xs)^( . {" . $start_pos . "} ) ( . {" . $end_pos . "} )/"

在回调中,在第2组上为xyz运行新的正则表达式替换 返回Catted原始组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
 );

答案 5 :(得分:0)

所以是的,我有点无聊,这可能是一种矫枉过正,但它会按你的要求行事:

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.

它也处理多个标签对。注意事项:

  1. 它的区分大小写
  2. $keepTags = false可能会留下双倍空格。您可能需要str_replace那些
  3. 希望它有所帮助。