替换所有出现的\\不是以

时间:2013-12-10 10:08:18

标签: php regex substring backslash

这应该很简单。我想改变所有这些子串:

\\somedrive\some\path

file://\\somedrive\some\path

但是如果子串已经有file://,那么我不想再次附加它。

这似乎没有做任何事情:

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

我做错了什么?此外,上述内容并未考虑file://已存在的情况;处理这个问题的最佳方法是什么?

更新测试输入:

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

\\someotherserver\path
';

测试输出:

file://\\someserver\some\path

file://\\someotherserver\path

感谢。

5 个答案:

答案 0 :(得分:1)

您还应该考虑string中的转义序列。

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

答案 1 :(得分:0)

使用正则表达式检查给定的子字符串是否以file://开头。如果是,请不要做任何事情。如果没有,请在字符串的开头附加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

答案 2 :(得分:0)

EDIT 多次出现:preg_replace('#((?!file://))\\\\#', '$1file://\\\\', $path)

答案 3 :(得分:0)

这将为您提供您期望的输出。由于php.net表示双斜杠将转换为单斜杠。

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

答案 4 :(得分:0)

请试试这个:

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