2013-12-16 26 views
2

我幾乎有我的正則表達式爲了瀏覽html頁面,但遇到了兩個問題,我試圖在我繼續之前得到壓扁,我需要能夠匹配空和斜槓(和空關閉報價),但已經用盡了我的能力,看看我在做什麼,有人可以幫助我的最後一點?PHP正則表達式缺少兩個匹配

$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

@愛姬:對不起,我忘記了'+' –

+0

很晚的回答,我已經接受了,但已經接受,但它加上了一個,很好的 – ehime

2

看看這對你的作品

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

不工作'未知修飾符'|''。 –

+0

@RahilWazir固定。 –

+0

FWIW,我thiknk原來的正則表達式避免匹配/ /引用內,而這一個接受它。 –