У меня возникли проблемы с функцией 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's hostel in the devil's seat
, но вместо этого я получаю p voos vlpss xn twt qxswop's wosttl xn twt stvxl's stpt
.
Однако, когда я пытаюсь заменить только 2 буквы, он заменяет их хорошо:
$new_message = str_replace(array('l','p'), array('a','e'), $message);
буквы l
и p
будут заменены на a
и e
.
Почему это не работает с полным массивом алфавита, если они оба одинакового размера?
Поскольку str_replace() заменяет слева направо, она может заменить ранее вставленное значение при выполнении нескольких замен.
// Выводит F, потому что A заменяется на B, затем B заменяется на C, и так далее... // Наконец, E заменяется на F, поскольку замена происходит слева направо. $search = array('A', 'B', 'C', 'D', 'E'); $replace = array('B', 'C', 'D', 'E', 'F'); $subject = 'A'; echo str_replace($search, $replace, $subject);
str_replace
с массивами просто выполняет все замены последовательно. Вместо этого используйте strtr
, чтобы выполнить все замены сразу:
$new_message = strtr($message, 'lmnopq...', 'abcdef...');
Проще и лучше, чем str_replace
:
<?php
$arr = array(
"http://" => "http://www.",
"w" => "W",
"d" => "D");
$word = "http://desiweb.ir";
echo strtr($word,$arr);
?>
strtr
PHP doc здесь
В качестве альтернативы в ответ помечен как правильный, если вы должны заменить слова вместо символов вы можете сделать это с этот кусок кода :
$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
Если текст простой разметки и существующие якоря, стадии существующие якорь теги во-первых, поменять URL-адреса, затем замените поставил метки.
`` $текст = ' Образцами Lorem ipsum просто манекен текста найти http://google.com/?q=lorem в в <а href=https и://ВСП.от Mozilla.орг/Ан-нас/для Firefox/>в Firefox</а>, в <а href="и https://www.apple.com/safari/">сафари</а> или https://www.google.com/chrome/ браузера.
Ссылка будет первый этап замены существующего якорь теги, заменять друг с маркером, а затем подключить остальные каналы. Ссылки должны быть правильно закодированы. Если ссылки не отделить от окружающего контента, как трейлинг и"." в период, потом он будет включен в ссылку. Ссылки, которые не закодированы должным образом, может создать проблемы, так что лучше использовать это, когда вы знаете текст, который вы обработки не смешивается с HTML.
Пример: http://google.com/i,м,complicate--d/index.html Пример: https://www.google.com/chrome/?123&т=123 Пример: http://google.com/?q='. функция urlencode('<а href="и http://google.com">http://google.com</а>') .' ';
// Замена существующих связей с маркером $linkStore = массив(); $текст = трое('/(<а.*?символом>)/', функция($матч) использовать (&$linkStore) ${ключ = 'linkStore'.граф($linkStore).''; $linkStore[$ключ] = $соответствует[0]; возвращать $ключ; }, $текст);
// Заменить оставшиеся адреса с помощью тега привязки $текст = preg_replace_callback("/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9-.]+.[a-zA-Z]{2,3}(\/\S*)?/", функция($матч) использовать (&$linkStore){ возвращение '<а href=" у'. $соответствует[0] .' на">'. $соответствует[0] .'</а>'; }, $текст);
// Заменить маркеры ссылку с оригинала $текст = как str_replace(array_keys($linkStore), array_values($linkStore), $текст);
Эхо '<заранее>'.$текста; ``