2013-12-16 27 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原来的正则表达式避免匹配/ /引用内,而这一个接受它。 –