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

Вы также должны рассмотреть escape-последовательность в string.

if((strpos($YOUR_STR, '\\\\') !== false) && (strpos($YOUR_STR, 'file://\\\\') === false)) 
    var_export(str_replace('\\\\', 'file://\\\\', $YOUR_STR)); 
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 
+0

Спасибо, но это одна строка, возможно, многие из этих подстрок .. некоторые с файла ': //' уже и некоторые без. – ale

+0

@ale: Он должен работать для обоих случаев. См. Обновленный ответ. –

+0

yeh, но что, если у вас есть что-то вроде \\ somedrive \ some \ path file: // \\ somedrive \ some \ path '(в любом порядке и любом числе) – ale

0

EDIT Для нескольких случаев: 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: // 'again, если' file: // 'уже был – ale

Смежные вопросы