Come posso abbinare un carattere specifico tra un intervallo specifico nella string?

Ho questa string:

$str = "here is start of rage, also here is some text and here is the end of string"; // ^^^^^ ^^^ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Ora sto provando a rimuovere tutta la lettera e tra questo intervallo: [ startend ]. Bene, voglio questa output :

 $newstr = "here is start of rag, also hr is som txt and hr is th end of string"; 

Come lo posso fare?

Con preg_replace e l'ancora \G :

 echo preg_replace('~(?:\G(?!\A)|\bstart\b)[^e]*\K(?:\Be|e(?!nd\b))~S', '', $str); 

dettagli:

 ~ (?: \G(?!\A) # contiguous to the previous match, not at the start of the string | # OR \bstart\b # the word "start" ) [^e]* # all that is not an "e" \K # exclude all previous matched characters from the whole match (?: \Be # an "e" that is not the start of a word | # OR e(?!nd\b) # an "e" that is not followed by "nd" ) ~ S # the STUDY modifier that tries to improve non-anchored patterns 

Questo model trova una "e" alla volta. Una volta trovata la parola "start", l'ancora \G forza la prossima corrispondenza ad essere contigua, poiché corrisponde alla posizione alla fine della precedente corrispondenza. Quando viene raggiunta la parola "fine" (?:\Be|e(?!nd\b)) fallisce e la contiguità viene interrotta (fino a quando un'altra parola "inizia").

Si noti che questo model non controlla se la parola "fine" esiste nella string (ma può essere facilmente eseguita). Se la parola "fine" non esiste, tutti "e" saranno rimossi dalla parola "inizio" fino alla fine della string.

È ansible combinare la sottostring e le funzioni di ritaglio .

Usa la sottostring per memorizzare le tre parti della tua string: 0 per iniziare, dall'inizio alla fine, per finire alla fine vera della tua string. Quindi è ansible utilizzare il trim sulla porzione centrale e quindi generare la concatenazione di queste tre parti.

Substr e str_replace sono la tua scelta per questo caso

 <?php $str = "here is start of rage, also here is some text and here is the end of string"; // ^^^^^ ^^^ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $start = 8; $end = 65; $newStr = substr($str, 0, $start). str_replace('e', '', substr($str, $start, $finish - $start)) . substr($str, $finish); var_dump($newStr); 

Non sei sicuro del motivo per cui vuoi davvero un'espressione regolare, ma ecco una soluzione

 $str = "here is start of rage, also here is some text and here is the end of string"; preg_match_all("/(.*?)start(.*?)end(.*?)$/", $str, $matches); $newstr = $matches[1][0] . "start" . str_replace("e", "", $matches[2][0]) . "end" . $matches[3][0]; var_dump($newstr); 

Cattura tutto prima start , tutto tra start e end , e anche tutto dopo la end . In altre parole: 3 gruppi.

La parte tra start e end dovrebbe essere e ritagliata. Le altre parti dovrebbero rimanere lì, quindi li ripristiniamo.

Credo che lo stesso si possa get usando preg_replace_callback