Ответы пользователя по тегу Регулярные выражения
  • Каким должно быть регулярное выражение для замены относительных ссылок на абсолютные (RSS)?

    faiwer
    @faiwer Автор вопроса
    frontend-developer
    В 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 он уже есть.

    Осталась только проблема с дублированием кода для одинарных и двойных кавычек. Но тут, честно говоря, мне кажется решений в лоб и не существует :)
    Ответ написан