2013-12-10 36 views
0

开头这应该很简单。我想改变所有这些子字符串:替换所有出现的\不以

\\somedrive\some\path 

file://\\somedrive\some\path 

但如果子已经有了一个file://然后我不想再追加它。

这似乎并没有做任何事情:

var_export(str_replace('\\\\', 'file://\\\\', '\\somedrive\some\path file://\\somedrive\some\path')); 

我在做什么错?另外,以上不会考虑已经在那里的file://;处理这个问题的最好方法是什么?

UPDATE测试输入:

$test = ' 
file://\\someserver\some\path 

\\someotherserver\path 
'; 

测试输出:

file://\\someserver\some\path 

file://\\someotherserver\path 

感谢。

回答

1

你也应该考虑在string转义序列。

if((strpos($YOUR_STR, '\\\\') !== false) && (strpos($YOUR_STR, 'file://\\\\') === false)) 
    var_export(str_replace('\\\\', 'file://\\\\', $YOUR_STR)); 
0

使用正则表达式来检查给定的子字符串是否以file://开头。如果是这样,不要做任何事情。

if (!preg_match("~^file://~i", $str)) { 
    $str = 'file://' . $str; 
} 

作为一个功能:

function convertPath($path) { 
    if (!preg_match("~^file://~i", $path)) { 
     return 'file://'.$path; 
    } 
    return $path; 
} 

测试用例:

echo convertPath('\\somedrive\some\path'); 
echo convertPath('file://\\somedrive\some\path'); 

输出:

file://\somedrive\some\path 
file://\somedrive\some\path 
如果没有,在字符串的开头追加 file://
+0

谢谢,但它是一个单一字符串,可能许多子的..有的用'文件://'已经和一些没有。 – ale

+0

@ale:它应该适用于这两种情况。查看更新后的答案。 –

+0

是的,但如果你有'\\ somedrive \ some \ path file:// \\ somedrive \ some \ path'之类的东西(以任何顺序和任何数字) – ale

0

编辑 对于多次出现:preg_replace('#((?!file://))\\\\#', '$1file://\\\\', $path)

0

这将工作给你你期望的输出。由于php.net表示双斜线将被转换为单斜杠。

if (!preg_match('/^file:\/\//', $str)) { 
    $str = "file://\\".stripslashes(addslashes($str)); 
} 
+0

关于双斜线转换的好处。然而,这个解决方案并没有处理如下:''\\ somedrive \ some \ path file:// \\ somedrive \ some \ path'(以任意顺序和任意数字)' – ale

0

请试试这个:

$string = "\\somedrive\some\path"; 
$string = "\\".$string; 
echo str_replace('\\\\', 'file://\\\\',$string); 
+0

'您的'str_replace'会预先添加' file://'如果'file://'已经存在, – ale