◆ substr の動きが違う
◆ PHP は length なのに 負値なら endindex になり後ろからカウントされる
◆ JavaScript と同じ動きになる関数がない 

JavaScript と PHP でコード変換してたときのこと

[php]
substr("abcdefghijklm", 5, -5);
=> "fgh"

これをそのまま JavaScript にすると

[JavaScript]
"abcdefghijklm".substr(5, -5)
 

空文字です

console に出して確認するのも大変な長文テキストかつ切り出してくっつけてを繰り返してる部分だったので原因みつけるのにちょっと苦労しました

PHP の substr って便利すぎるというかこういう場合はこうなるとかが多すぎてシンプルに引数の意味が決まらないんですね

substr(string, start, length) という引数ですが length がマイナスだと後ろから N 文字目という もう length じゃなくなってる動きをします

JavaScript の場合は substr メソッドは start と length が引数で length が 0 以下なら空文字です
slice というメソッドもあり こっちは start と end で両方ポジションです
ポジションなので end が負の数なら後ろから数えます
こっちなら PHP と同じ結果です
"abcdefghijklm".slice(5, -5)
// "fgh"

ですが end が正の数ときは
"abcdefghijklm".slice(3, 5)
// "de"
substr("abcdefghijklm",3, 5);
=> "defgh"

結果が変わってきます

PHP のは便利には違いないですが 一つの関数であれこれ状況によって動き変わると見つけにくいバグのもとになるので JavaScript くらいのほうが好きです
length なのに負の数なら後ろからの index になると負値なら空文字だよね と思って計算結果そのまま入れるようにしたら予想外の結果になったりしそうです

それ以上に単純に置き換えられる関数がないのはちょっと不便