Пример:
«Здравствуйте, я [строка] строки, и я очень доволен тем, что [конец] строки … …;
Теперь допустим, что я хочу изменить что-то в подстроке между [start] и [end]. Я знаю, как узнать str_pos и длину до конца, но как я могу найти и заменить то, что влияет только на эту подстроку?
Что я хочу сделать, это: (например)
Замените «х» на «у» в строке 5 и 50
Я знаю, что есть substr_replace, но это не совсем то, что я ищу.
Любые идеи были бы отличными, большое спасибо!
Если я правильно понимаю, вы хотите заменить что-то в подстроке, зная, что это позиция в родительской строке. С помощью 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...
Как насчет чего-то вроде …
<?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\].*)(*SKIP)(*F)|a
если строка
str_repalce(needle, replace, haystack)
если массив
json_encode haystack
str_replace needle, replace, haystack)
json_decode haystack
Знание позиции str не очень важно для вас, когда, если вы знаете, что ищете, вы можете просто заменить это на что-то другое, просто запомните правило двойных кавычек, чтобы использовать php vars «$ haystack», и одинарные кавычки будут отображаться точно так же, как вы набираете «стог сена»
это, безусловно, самый простой и лучший способ заменить текст или значения в строке или в массиве, но перед использованием ознакомьтесь с документацией к функциям, чтобы понять, как они работают. Json_encode / Decode может быть сложным в освоении, но как только вы поймете это, вы сможете использовать его для преобразования ваших массивов в строки и обратно, что будет легко.
Вы можете сделать это с помощью обратного вызова.
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
);
Так что да, мне было немного скучно, и это может быть излишним, но он делает то, что вы просите:
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_replace
теНадеюсь, поможет.