Поиск и замена символов в подстроке

Пример:

«Здравствуйте, я [строка] строки, и я очень доволен тем, что [конец] строки … …;

Теперь допустим, что я хочу изменить что-то в подстроке между [start] и [end]. Я знаю, как узнать str_pos и длину до конца, но как я могу найти и заменить то, что влияет только на эту подстроку?

Что я хочу сделать, это: (например)
Замените «х» на «у» в строке 5 и 50

Я знаю, что есть substr_replace, но это не совсем то, что я ищу.

Любые идеи были бы отличными, большое спасибо!

0

Решение

Если я правильно понимаю, вы хотите заменить что-то в подстроке, зная, что это позиция в родительской строке. С помощью 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

Другие решения

Как насчет чего-то вроде …

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

Распечатает что-то вроде:

мое первое слово было первым, тогда это было второе слово

мое первое слово было вторым, тогда это было второе слово

0

Вот пример шаблона, чтобы найти букву «а» между [начало] и [конец]

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

демонстрация

0

если строка

str_repalce(needle, replace, haystack)

если массив

json_encode haystack
str_replace needle, replace, haystack)
json_decode haystack

Знание позиции str не очень важно для вас, когда, если вы знаете, что ищете, вы можете просто заменить это на что-то другое, просто запомните правило двойных кавычек, чтобы использовать php vars «$ haystack», и одинарные кавычки будут отображаться точно так же, как вы набираете «стог сена»

это, безусловно, самый простой и лучший способ заменить текст или значения в строке или в массиве, но перед использованием ознакомьтесь с документацией к функциям, чтобы понять, как они работают. Json_encode / Decode может быть сложным в освоении, но как только вы поймете это, вы сможете использовать его для преобразования ваших массивов в строки и обратно, что будет легко.

0

Вы можете сделать это с помощью обратного вызова.

Regex:

"/(?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
);
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 те

Надеюсь, поможет.

0
По вопросам рекламы [email protected]