PHP Regex错过了两场比赛

时间:2013-12-16 21:09:10

标签: php regex preg-replace

我几乎把我的正则表达式用于浏览html页面,但是在我继续操作之前遇到了两个问题,我试图让它们被压扁,我需要能够匹配空和斜线(以及空的结束报价)但是我已经筋疲力尽地看到了我正在做的事情,有人能帮我最后一点吗?

$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;

预期输出位于评论部分,谢谢。

2 个答案:

答案 0 :(得分:2)

看看这是否适合你

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

答案 1 :(得分:1)

您可以使用此模式:

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

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