Подтвердить что ты не робот

Str_replace с массивом

У меня возникают проблемы с функцией PHP str_replace при использовании массивов.

У меня есть это сообщение:

$message = strtolower("L rzzo rwldd ty esp mtdsza'd szdepw ty esp opgtw'd dple");

И я пытаюсь использовать str_replace следующим образом:

$new_message = str_replace(
    array('l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','a','b','c','d','e','f','g','h','i','j','k'),
    array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'),
    $message);

Результат должен быть A good glass in the bishop hostel in the devil seat, но вместо этого я получаю p voos vlpss xn twt qxswop wosttl xn twt stvxl stpt.

Однако, когда я только пытаюсь заменить 2 буквы, они хорошо их заменяют:

$new_message = str_replace(array('l','p'), array('a','e'), $message);

буквы l и p будут заменены на a и e.

Почему он не работает с полным алфавитным массивом, если они оба имеют одинаковый размер?

4b9b3361

Ответ 1

str_replace с массивами просто выполняет все замены последовательно. Используйте strtr, чтобы сделать все сразу:

$new_message = strtr($message, 'lmnopq...', 'abcdef...');

Ответ 2

Поскольку str_replace() заменяет слева направо, он может заменить ранее вставленное значение при выполнении нескольких заметок.

    // Outputs F because A is replaced with B, then B is replaced with C, and so on...
    // Finally E is replaced with F, because of left to right replacements.
    $search  = array('A', 'B', 'C', 'D', 'E');
    $replace = array('B', 'C', 'D', 'E', 'F');
    $subject = 'A';
    echo str_replace($search, $replace, $subject);

Ответ 3

Легче и лучше, чем str_replace:

<?php
$arr = array(
    "http://" => "http://www.",
    "w" => "W",
    "d" => "D");

    $word = "http://desiweb.ir";
    echo strtr($word,$arr);
?>

strtr PHP документ здесь

Ответ 4

В качестве альтернативы ответ, помеченный как правильный, если вам нужно заменить слова вместо символов, вы можете сделать это с помощью этого фрагмента кода:

$query = "INSERT INTO my_table VALUES (?, ?, ?, ?);";
$values = Array("apple", "oranges", "mangos", "papayas");
foreach (array_fill(0, count($values), '?') as $key => $wildcard) {
    $query = substr_replace($query, '"'.$values[$key].'"', strpos($query, $wildcard), strlen($wildcard));
}
echo $query;

Демо здесь: http://sandbox.onlinephpfunctions.com/code/56de88aef7eece3d199d57a863974b84a7224fd7

Ответ 5

Если текст представляет собой простую разметку и имеет существующие привязки, сначала разбейте существующие теги привязки, поменяйте местами URL-адреса, а затем замените поставленные маркеры.

$text = '
Lorem Ipsum is simply dummy text found by searching http://google.com/?q=lorem in your <a href=https://www.mozilla.org/en-US/firefox/>Firefox</a>,
<a href="#" onclick="location.href='https://www.apple.com/safari/'; return false;">Safari</a>, or https://www.google.com/chrome/ browser.

Link replacements will first stage existing anchor tags, replace each with a marker, then swap out the remaining links.
Links should be properly encoded.  If links are not separated from surrounding content like a trailing "." period then they it will be included in the link.
Links that are not encoded properly may create a problem, so best to use this when you know the text you are processing is not mixed HTML.

Example: http://google.com/i,m,complicate--d/index.html
Example: https://www.google.com/chrome/?123&t=123
Example: http://google.com/?q='. urlencode('<a href="#" onclick="location.href='http://google.com'; return false;">http://google.com</a>') .'
';

// Replace existing links with a marker
$linkStore = array();
$text = preg_replace_callback('/(<a.*?a>)/', function($match) use (&$linkStore){ $key = '__linkStore'.count($linkStore).'__'; $linkStore[$key] = $match[0]; return $key; }, $text);

// Replace remaining URLs with an anchor tag
$text = preg_replace_callback("/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/", function($match) use (&$linkStore){ return '<a href="'. $match[0] .'">'. $match[0] .'</a>'; }, $text);

// Replace link markers with original
$text = str_replace(array_keys($linkStore), array_values($linkStore), $text);

echo '<pre>'.$text;