Mi sembra strano che un carattere "a capo" in php venga contato come 4 caratteri, posso capire due (la sequenza CR e LF) ma 4?

Io partirei dal trovare le differenze tra la stringa per come la vede javascript e per come la vede php.

Detto questo, considera che i due potrebbero benissimo gestire il carattere a capo in modo diverso per il semplice fatto che il comportamento di javascript dipende dal S.O. del client mentre per PHP dipende dal S.O. del server, e sistemi operativi diversi codificano gli "a capo" con sequenze diverse.

Ergo, se vuoi che siano identici dovresti assicurarti che le sequenze "a capo" siano identici, magari potresti fare una copia della stringa in cui hai sostituito le sequenze di "a capo" più lunghe con un carattere singolo e usare quella stringa modificata per contare