Posso usare preg_replace per rimuovere il file \ n finale in modalità multilinea?

Ho appena risposto a una domanda qui , che mi ha lasciato fare la mia stessa domanda.

Fondamentalmente, l'OP voleva che qualsiasi row venisse rimossa se contenesse una string. Ecco una regex che ho inventato …

$str = preg_replace('/^.*\b["(]?hello["(]?\b.*$/m', '', $str); 

Funziona alla grande, ma poiché $ corrisponde prima del trailing \n , rimangono quando vengono sostituiti e ci sono linee vuote, ad es

 string(90) " What it shouldhello do is: could be words in between brackets and inverted commas also." 

Non posso usare \z perché sono in modalità multilinea (alless questo è ciò che penso).

Se uso s modificatore s , il . diventare troppo avido e non lavorare attraverso i newline.

Ho provato alcune cose (come [^\n] e [\s\S] ), e ora sono perplesso.

Come posso abbinare quel trailing \n qui in modo che venga rimosso con la sostituzione?

Grazie.

Usa \ n invece di $.

 $str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n/m', '', $str); 

Questo manca l'ultima row se ci fosse successo, quindi ecco un ulteriore passo avanti.

 $str = preg_replace('/^.*\b["(]?hello["(]?\b.*(\n|$)/m', '', $str); 

Il problema ora è che l'ultima row è stata rimossa, ma c'è ancora un carattere \ n (problema simile che stai già avendo).

Nota: non sono affatto un esperto di espressioni regolari, ma di solito riesco a fare abbastanza per le mie esigenze.

Mi sento piuttosto sciocco per non aver capito questo, ma ho usato la risposta di Jacob come base …

 $str = preg_replace('/^.*\b["(]?hello["(]?\b.*\n?/m', '', $str); 

Sembra che fossi troppo desideroso di usare l'ancora di fine linea.

Questo permette l'opzione \n alla fine. Lascia anche un \n alla fine dell'ultima row non abbinata, ma potrei sempre trim($str) .

Per favore prova questo:

 $str = preg_replace('/^.*?\b["(]?hello["(]?\b.*?$/s', '', $str); 

.*? lo rende non-goloso.