2014-09-14 5 views
0

Exemple:Rechercher et remplacer caractère dans un sous-chaîne

« Bonjour iam un [début] chaîne et iam très heureux [fin] beeing une chaîne ... »;

Maintenant, supposons que je veux seulement changer quelque chose dans la sous-chaîne entre le [début] et [fin]. Je sais comment trouver les str_pos et la longueur jusqu'à la fin, mais comment puis-je rechercher et remplacer quelque chose qui n'affecte que cette sous-chaîne?

Ce que je veux faire est: (par exemple) Remplacer « x » avec « y » au sein str positon 5 et 50

Je sais qu'il ya substr_replace mais c'est pas exactement ce que iam recherche.

Toutes les idées serait génial, merci beaucoup!

+1

Je relis votre question à plusieurs reprises. Je ne comprends pas. Pourriez-vous essayer de reformuler? –

+0

Vous pourriez fusionner 'str_pos()' et 'str_replace()' –

+0

Pourquoi le vote serré? Je pense que c'est assez clair ce que OP veut: Remplacer les occurrences de X dans une sous-chaîne délimitée par [start] et [end]. – Schlaus

Répondre

0

Que diriez-vous quelque chose comme ...

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

imprimera quelque chose comme:

mon premier mot a été d'abord, puis ce fut le deuxième mot

mon premier mot était deuxième puis ce fut le deuxième mot

0

ici est un exemple de motif pour trouver la lettre 'a' entre le [début] et [fin]

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

Demo

0

si est une chaîne

str_repalce(needle, replace, haystack) 

si le tableau

json_encode haystack 
str_replace needle, replace, haystack) 
json_decode haystack 

Connaissant la position str est noit vraiment de valeur pour vous quand vous savez ce que vous cherchez, vous pouvez simplement le remplacer par Autre chose suffit de se rappeler la règle des guillemets doubles pour utiliser php vars "$ haystack" et guillemets simples rendra exactement comme vous tapez '$ haystack'

c'est de loin le moyen le plus simple et le meilleur moyen de remplacer le texte ou les valeurs dans un chaîne ou dans un tableau mais s'il vous plaît lire la documentation des fonctions avant utilisation afin que vous compreniez comment ils fonctionnent. Json_encode/Decode peut être une chose difficile à maîtriser mais une fois que vous l'avez compris, vous pouvez l'utiliser pour transformer vos tableaux en chaînes et en revenir facilement.

0

Vous pouvez le faire avec un rappel.

Regex:

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

A l'intérieur du rappel, exécutez un nouveau remplacement regex sur le groupe 2 pour xyz.
Retour Groupe d'origine Catted 1 et groupe remplacé 2.

code non testé:

$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

Alors oui, j'étais un peu ennuyé, et cela peut-être trop, mais il fait ce que vous demandez:

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


} 

L'utilisation est simple:

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. 

Il gère également plusieurs paires de balises. Points à noter:

  1. il est sensible à la casse
  2. $keepTags = false pourrait laisser des espaces doubles. Vous pourriez vouloir str_replace ces

Espérons que cela aide.

1

Si je comprends bien, vous voulez remplacer quelque chose dans une sous-chaîne tout en sachant que c'est la position dans sa chaîne parente. L'utilisation substr() et preg_replace peut le faire facilement:

code:

$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; 

Résultat:

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