Php 未遵循模式时进行预更换

Php 未遵循模式时进行预更换,php,regex,preg-replace,Php,Regex,Preg Replace,使用preg\u replace,我希望替换“管道后面不跟http://”的所有实例,如果管道后面跟http://,则不执行任何操作。比如说, 以下字符串: http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf| 一旦运行,预更换将变为: http://www.xyz.org/docs/pdfs/2014/file_n

使用
preg\u replace
,我希望替换“管道后面不跟
http://
”的所有实例,如果管道后面跟
http://
,则不执行任何操作。比如说,

以下字符串:

http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|
一旦运行,预更换将变为:

http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|
到目前为止,我使用的代码替换了所有管道

$string = trim(preg_replace("/\|\|+/", "|", $string));
$string = str_replace("|", "|http://www.xyz.org/docs/pdfs/2014/", $string);

可能通过使用爆炸和测试一个接一个

$string = 'http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|';
$string = addHttp($string); 

function addHttp($string) {
    $a_string = explode('|', $string);
    $return_string = '';
    foreach($a_string as $a_s) {
        if(trim($a_s) == '')
            continue; 

        if(preg_match('#^http://#', $a_s))
            $return_string .= $a_s.'|';
        else
            $return_string .= 'http://'.$a_s.'|';
    }

    return $return_string;
}

编辑:我通过preg_match更改了strpos

我认为您只需要使用“消极前瞻”

代码:

这是一个简化的示例,它还替换了字符串中最后一个尾随“|”,但您了解了正则表达式的概念。

如果需要,您可以使用正则表达式的这个变体来处理尾随条,
/\\\\\;(?!(http:\/\/\\$)/
,它也使用前视来检查字符串的结尾。

[1]:[2]:[3]:检查这些链接我没有想到使用分解。谢谢你,这很有效,我进展得很好。这很有效,但你做了很多不必要的工作
preg_replace()
非常适合这项工作,如图所示。谢谢。您的示例从字符串中删除了文件_name_2.pdf,因为我需要在文件名之前插入“”。我意识到了这一点,并在您发布时更正了我的答复:-)谢谢。我测试了你的,它工作正常。剩下的问题是,它使用URL转换最后一个管道,希望最后一个管道从字符串中剥离。我已经试着去做了,但是我一直在搞砸其他方面。在最后一句中给出的替代正则表达式不处理尾管吗<代码>/\\\\;(?!(http:\/\/\$)/我认为应该按照您在问题中给出的预期结果保留管道未更换。
<?php
   $a = 'http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|';
   $b = preg_replace("/\|(?!http:\/\/)/",'|http://www.xyz.org/docs/pdfs/2014/',$a);
   echo 'A: '.$a."\n";
   echo 'B: '.$b."\n";
?>
> A: http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|
> B: http://www.xyz.org/docs/pdfs/2014/file_name_1.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_2.pdf|http://www.xyz.org/docs/pdfs/2014/file_name_3.pdf|http://www.xyz.org/docs/pdfs/2014/