使用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);
答案 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