未遵循模式时的preg_replace

时间:2014-01-21 13:20:01

标签: php regex preg-replace

使用preg_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|

一旦运行,preg_replace将成为:

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

2 个答案:

答案 0 :(得分:2)

我认为你只需要使用'负向前瞻'......

CODE:

<?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";
?>

此正则表达式 \|(?!http:\/\/) 将匹配...

  • \| 竖线
  • (?!http:\/\/) 后面没有http://(这是负前瞻零宽度断言)

输出:

> 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/

这是一个简化的例子,它也取代了最后一个尾随'|'在你的字符串中,你可以了解正则表达式。
如果需要,您可以使用正则表达式/\|(?!(http:\/\/|$))/的这种变体来处理尾随条,它使用前瞻来检查字符串的结尾。

答案 1 :(得分:0)

也许通过使用爆炸和逐个测试

$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