Php 搜索和替换子字符串中的字符
例如: “你好,我是一个[开始]字符串,我非常高兴[结束]是一个字符串…” 现在让我们假设我只想在[start]和[end]之间的子字符串中更改一些内容。我知道如何找到str_pos和到末尾的长度,但如何搜索和替换只影响此子字符串的内容 我想做的是:(例如) 将str位置5和50内的“x”替换为“y” 我知道有替代品,但那不是我想要的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
任何想法都很好,非常感谢 像
<?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。