2013-12-16 3 views
2

У меня почти есть регулярное выражение для сглаживания html-страниц, но я столкнулся с двумя проблемами, которые я пытаюсь получить, прежде чем продолжить, мне нужно иметь возможность сопоставлять как пустые, так и косые черты (и пустая цитата закрытия), но исчерпали мою способность видеть, что я делаю, может кто-то помочь мне с финальным бит?PHP Regex отсутствует два совпадения

$pathspec='in-front'; 

$subjects = array(
    '<base href="http://foo.com/images/" target="_blank">', # no changes    (correct) 
    '<base href="/" target="_blank">',      # '/in-front/'   (fails) 
    '<a href="https://foo.com/images/">Foo</a>',   # no changes    (correct) 
    '<a href="">Foo</a>',         # '/in-front/'   (fails) 
    '<img src="bar/foo.png" />',       # no changes    (correct) 
    '<img src="/bar/foo.png" />',       # '/in-front/bar/foo.png' (correct) 
); 


foreach ($subjects AS $subject) 

    echo preg_replace('/(href|src)=["\']?\/(?!\/)([^"\'>]+)["\']?/', "$1='/$pathspec/$2'", $subject) . "\n"; 

die; 

Ожидаемый результат в части комментариев, спасибо.

+1

@php_nub_qq: Да что? –

+0

Итак, в основном вы хотите добавить '$ pathspec' в любой пустой или корневой атрибут href, да? –

+0

@php_nub_qq закрыть, внимательно прочитать регулярное выражение, а также ожидаемые выходы вместе с их входами. – ehime

ответ

1

Вы можете использовать этот шаблон:

$pattern = '~\b(?:href|src)\s*=\s*(["\']?+)\K(?:/|(?=[\s>]|\1))~i'; 
$replacement = "/$pathspec/"; 

$result = preg_replace($pattern, $replacement, $subject); 
+0

Этот шаблон неверно избегает протоколов и соответствует всем: http://pastebin.com/Sfm4004w ему также нужен побег в '([" ']?) ' – ehime

+0

@ehime: извините, я забыл' + ' –

+0

Отличный поздний ответ, который я уже принял, но плюс один для него, отлично работает – ehime

2

Смотрите, если это работает для вас

preg_replace('#(href|src)=["\'](?:/|/(?!\/)(\S+?)|)["\']#',"$1='/$pathspec/$2'",$subject) 
+0

Не работает 'Unknown modifier '|''. –

+0

@RahilWazir исправлена. –

+0

FWIW, I thiknk исходное регулярное выражение избегало совпадения // внутри кавычек, тогда как это его принимало. –

Смежные вопросы