PHP正则表达式缺少两个匹配项
我几乎用我的正则表达式来浏览html页面,但遇到了两个问题,在我继续之前,我试图将它们压扁。我需要能够匹配空斜杠和空斜杠(以及空的结束引号),但我已经用尽了我的能力来查看我在做什么,有人能帮我做最后一点吗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)
$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我注意到您的代码中有一点不起作用,那就是如果它在javascriptga.src=(''==document.location.protocol
中遇到类似这样的内容,因为它不会向后查找空白,它将替换它=(@ehime:ok,看看这个:。我看过你的代码,但没有测试过,但是注意:preg\u replace可以处理模式/替换数组,使用数组值和for循环是没有用的。这里不需要转义斜杠
,因为分隔符是~