2013-12-10 65 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

相關問題