В JavaScript много чего нет в поддержке регулярок. Только самый минимум. Про ретроспективную негативную проверку я знаю, сам же выше и написал про неё :) До сих пор не придумал как её здесь можно развернуть. Зато придумал решение с опережающей позитивной проверкой. Получилось так:
static public function relative_to_absolute( $text )
{
$rg =
'#'.
'(<\w+\s.*)'. // "<img "
'(href|src)\s*=\s*'. // "src = "
'(?:'.
'\'(?![\w:]+//)/?([^\']+)\''.'|'. // 'relative'
'\"(?![\w:]+//)/?([^\"]+)\"'. // "relative"
')'.
'#';
$replace = $text;
$host = self::base('http');
do
{
$text = $replace;
$replace = preg_replace( $rg, '$1$2="'.$host.'$4"', $replace );
}
while( $text !== $replace );
return $replace;
}
(?![\w:]+//) — «говорит» о том, что после кавычки не будет протокола,
/? — игнорирует лидирующий слеш на случай если таковой имеется, ибо в $host он уже есть.
Осталась только проблема с дублированием кода для одинарных и двойных кавычек. Но тут, честно говоря, мне кажется решений в лоб и не существует :)