2015-09-09 2 views
0

Я хочу, чтобы изменить следующие ниже:
% => \%
_   => \ _
\     => \\ошибки preg_replace на специальных символов

Eg:

1. ali% sdn bhd -> ali\% sdn bhd 
2. ali_ sdn bhd -> ali\_ sdn bhd 
3. ali\ sdn bhd -> ali\\ sdn bhd 

А вот код, написанный:

<?php 
$special_characters = array("%","_","\\"); 
$replace_special_characters = array("\\%","\\_","\\\\\\\\"); 

foreach($special_characters as $value) 
{ 
     if(strpos($companyname, $value) !== FALSE) 
     { 
      $companyname = preg_replace('/'.$value.'/', $replace_special_characters, $companyname); //ERROR HERE 
     } 
} 
?> 

Однако, с выходом выше, я получаю эту ошибку:

Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array ... 

Какую часть я написал не так? Как мне его изменить?

+0

может быть, я пропустил что-то очевидное здесь, но это не распространяется уже функцией str_replace? http://us1.php.net/manual/en/function.str-replace.php – cypherabe

ответ

0

Проблема в том, что вы не можете заменить string на array, используя preg_replace.

Вы должны получить позицию вашего элемента в массиве, а затем получить замену, используя эту позицию:

<?php 
$special_characters = array("%","_","\\"); 
$replace_special_characters = array("\\%","\\_","\\\\\\\\"); 

$i = 0; //set the original position 
foreach($special_characters as $value) 
{ 
     if(strpos($companyname, $value) !== FALSE) 
     { 
      echo '/'.$value.'/'; 
      $companyname = preg_replace('/'.$value.'/', $replace_special_characters[$i], $companyname); //Here you get replacement using the current position, so a string is set as replacement, not an array 
     } 
     $i++;//after each value, you increment the position 
} 
?> 

Я не уверен, если этот код работает, но он показывает логику, необходимую для реализации.

+0

это не сработает, другая ошибка в той же строке: preg_replace(): no end delimiter '/' found ... –

+0

As I сказал, что это не гарантированно работает, цель здесь состоит в том, чтобы вы поняли, какова ваша ошибка. Я думаю, вы должны добавить отладку перед preg_replace, чтобы узнать, какое значение $ вы ищете в настоящее время. Я обновил пример, чтобы показать вам, как – Supamiu

0

Почему бы не использовать str_replace?

$string = 'ali% sdn bhd ali_ sdn bhd ali\ sdn bhd'; 
$res = str_replace(array("\\","%","_"), array("\\\\","\\%","\\_"), $string); 
echo $res,"\n"; 

Выход:

ali\% sdn bhd ali\_ sdn bhd ali\\ sdn bhd 

Из документации:

Caution Replacement order gotcha

Because str_replace() replaces left to right, it might replace a previously inserted value when doing multiple replacements. See also the examples in this document.