Для этой очень специфической проблемы также может не использоваться регулярное выражение. Если ваш список длинный (несколько тысяч URL-адресов) и время вас не устраивает, вы можете вручную написать код этой очень простой манипуляции.
Это будет делать то же самое:
$str .= (substr($str, -1) == '/' ? '' : '/');
Это, конечно, не почти столь же элегантно или гибко, как регулярное выражение, но это позволяет избежать лишних затрат на анализ строки регулярного выражения и будет выполняться так быстро, как это сможет сделать PHP.
Возможно, он менее читабелен, чем регулярное выражение, хотя это зависит от того, насколько удобен читатель с синтаксисом регулярных выражений (некоторые люди могут найти его более читабельным).
Это, конечно, не проверит, что строка действительно является правильно сформированным URL (например, регулярное выражение zerkms), но вы уже знаете, что ваши строки в любом случае являются URL, так что это немного избыточно.
Хотя, если в вашем списке 10 или 20 URL, забудьте этот пост. Используйте регулярное выражение, разница будет равна нулю.