Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式缺少两个匹配项_Php_Regex_Preg Replace - Fatal编程技术网

PHP正则表达式缺少两个匹配项

PHP正则表达式缺少两个匹配项,php,regex,preg-replace,Php,Regex,Preg Replace,我几乎用我的正则表达式来浏览html页面,但遇到了两个问题,在我继续之前,我试图将它们压扁。我需要能够匹配空斜杠和空斜杠(以及空的结束引号),但我已经用尽了我的能力来查看我在做什么,有人能帮我做最后一点吗 $pathspec='in-front'; $subjects = array( '<base href="http://foo.com/images/" target="_blank">', # no changes (correct)

我几乎用我的正则表达式来浏览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;
$pathspec='front';
$subjects=数组(
'',#无变化(正确)
'',#'/前面/'(失败)
'',#无变化(正确)
'',#'/前面/'(失败)
'',#无变化(正确)
'',#'/front/bar/foo.png'(正确)
);
foreach($subject作为$subject)
echo preg\u replace('/(href | src)=[“\']”吗?\/(?!\/)([^“\'>]+)[“\']”吗?/”,“$1='/$pathspec/$2'”,$subject)。“\n”;
死亡

预期输出在评论部分,谢谢。

看看这是否适合您

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

您可以使用以下模式:

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

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

@php_nub_qq:Huh什么?那么基本上你想要的是在任何空或根href属性中添加
$pathspec
,是吗?@php_nub_qq关闭,仔细阅读正则表达式,以及预期的输出和它们的输入。FWIW,我认为原始正则表达式避免在引号中匹配//而这个正则表达式接受它。@PeterAlfvin我编辑了他的answer避免协议相关URL,等待他接受更改该模式将只匹配空URL或以正斜杠开头的URL,双斜杠怎么会造成干扰?双斜杠被视为“协议相关URL”又名
//google.com
对任何一种
https://google.com
http://google.com
是否通过SSL认证的主机。在处理其他人的数据时要记住;)@ehime这是我不知道的。您能再次建议编辑吗,因为我自动假设它与
uknown修饰符
错误有关,并拒绝了它即使是阅读。这种模式也不能正确地避免协议,并且匹配所有内容:它还需要在
([“]”?)
@ehime:对不起,我忘记了
+
。很好的迟来回答,我已经接受了,但加上一个,作品great@CasmirEtHippolyte我注意到您的代码中有一点不起作用,那就是如果它在javascript
ga.src=(''==document.location.protocol
中遇到类似这样的内容,因为它不会向后查找空白,它将替换它=(@ehime:ok,看看这个:。我看过你的代码,但没有测试过,但是注意:preg\u replace可以处理模式/替换数组,使用数组值和for循环是没有用的。这里不需要转义斜杠
,因为分隔符是
~