PHP 日本會議 2024

strtr

(PHP 4, PHP 5, PHP 7, PHP 8)

strtr轉換字元或替換子字串

描述

strtr(字串 $string, 字串 $from, 字串 $to): 字串

替代簽名 (不支援具名引數)

strtr(字串 $string, 陣列 $replace_pairs): 字串

如果給定三個引數,此函式會傳回 string 的副本,其中 from 中每個 (單一位元組) 字元的所有出現次數都會轉換為 to 中的對應字元,也就是說,每個 $from[$n] 的出現次數都會被替換為 $to[$n],其中 $n 是兩個引數中有效的偏移量。

如果 fromto 的長度不同,則會忽略較長者中額外的字元。string 的長度會與傳回值的長度相同。

如果給定兩個引數,則第二個引數應為 陣列,格式為 array('from' => 'to', ...)。傳回值是一個 字串,其中所有出現的陣列鍵都會被替換為對應的值。會先嘗試最長的鍵。一旦子字串被替換,則不會再次搜尋其新值。

在這種情況下,鍵和值可以有任何長度,前提是沒有空的鍵;此外,傳回值的長度可能與 string 的長度不同。不過,當所有鍵都具有相同大小時,此函式的效率最高。

參數

string

正在轉換的 字串

from

正在轉換為 to字串

to

取代 from字串

replace_pairs

可以使用 replace_pairs 參數來代替 tofrom,在這種情況下,它是格式為 array('from' => 'to', ...)陣列

如果 replace_pairs 包含一個為空 字串 ("") 的鍵,則會忽略該元素;自 PHP 8.0.0 起,在這種情況下會引發 E_WARNING

傳回值

傳回轉換後的 字串

範例

範例 #1 strtr() 範例

<?php
//在此形式中,strtr() 會進行逐位元組轉換
//因此,我們在這裡假設單一位元組編碼:
$addr = strtr($addr, "äåö", "aao");
?>

下一個範例顯示在只使用兩個引數呼叫 strtr() 時的行為。請注意替換的優先順序(由於有更長的符合項目,因此不會選取 "h"),以及如何不再次搜尋替換的文字。

範例 #2 具有兩個引數的 strtr() 範例

<?php
$trans
= array("h" => "-", "hello" => "hi", "hi" => "hello");
echo
strtr("hi all, I said hello", $trans);
?>

上面的範例會輸出

hello all, I said hi

這兩種行為模式大不相同。使用三個引數時,strtr() 將替換位元組;使用兩個引數時,可能會替換較長的子字串。

範例 #3 strtr() 行為比較

<?php
echo strtr("baab", "ab", "01"),"\n";

$trans = array("ab" => "01");
echo
strtr("baab", $trans);
?>

上面的範例會輸出

1001
ba01

另請參閱

新增附註

使用者貢獻的附註 32 則附註

118
evan dot king at NOSPAM dot example dot com
9 年前
這是一個重要的真實世界範例,其中 strtr 的使用案例,str_replace 將無法運作或會引入模糊的錯誤

<?php

$strTemplate
= "My name is :name, not :name2.";
$strParams = [
':name' => 'Dave',
'Dave' => ':name2 or :password', // 否則輸入會有問題
':name2' => 'Steve',
':pass' => '7hf2348', // 可能不該出現在這裡的敏感資料
];

echo
strtr($strTemplate, $strParams);
// "My name is Dave, not Steve."

echo str_replace(array_keys($strParams), array_values($strParams), $strTemplate);
// "My name is Steve or 7hf2348word, not Steve or 7hf2348word2."

?>

任何時候當您嘗試將字串模板化,但不一定知道替換的鍵/值會是什麼(或完全理解其含義並控制其內容和順序)時,`str_replace` 會引入錯誤匹配鍵的潛在可能性,因為它不會先展開最長的鍵。

此外,`str_replace` 會在先前的替換中進行替換,這可能會引入意料之外的巢狀展開。這樣做可能會將錯誤的資料放入「子模板」中,甚至讓使用者有機會提供暴露資料的輸入(如果他們可以定義某些替換字串)。

除非您需要且知道它是安全的,否則請勿支援遞迴展開。當您確實支援它時,請明確地重複呼叫 `strtr`,直到不再發生展開或達到合理的迭代限制,以便結果永遠不會隱式地取決於替換鍵的順序。同時請確保任何使用者輸入都會在任何敏感資料已展開到輸出中並且不再作為輸入可用的情況下,在隔離的步驟中展開。

注意:在您的鍵周圍使用一些字元來指定它們,也可以降低意外損壞輸出的可能性,無論是惡意觸發或其他方式。因此,在這些範例中使用冒號前綴,當您接受替換輸入到您的模板/翻譯系統時,您可以輕鬆地強制執行此操作。
63
Hayley Watson
11 年前
由於 `strtr`(與 PHP 的其他字串函式一樣)將字串視為位元組序列,並且由於 UTF-8 和其他多位元組編碼根據定義至少對某些字元使用多個位元組,因此三字串形式很可能會出現問題。請使用關聯陣列形式來指定映射。

<?php
// 假設是 UTF-8
$str = 'Äbc Äbc'; // strtr() 將此視為九個位元組 (包括每個 Ä 的兩個位元組)
echo strtr($str, 'Ä', 'a'); // 第二個參數等同於字串 "\xc3\x84",所以 "\xc3" 被 "a" 取代,而 "\x84" 被忽略

echo strtr($str, array('Ä' => 'a')); // 效果好得多
?>
19
allixsenos at gmail dot com
15 年前
修復了下面編寫的 "normaliza" 函式,以包含斯拉夫拉丁字元...此外,它不再返回小寫字母(您可以輕鬆地自行套用 `strtolower` 來取得)...

此外,重新命名為 `normalize()`

<?php

function normalize ($string) {
$table = array(
'Š'=>'S', 'š'=>'s', 'Đ'=>'Dj', 'đ'=>'dj', 'Ž'=>'Z', 'ž'=>'z', 'Č'=>'C', 'č'=>'c', 'Ć'=>'C', 'ć'=>'c',
'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O',
'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss',
'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e',
'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o',
'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b',
'ÿ'=>'y', 'Ŕ'=>'R', 'ŕ'=>'r',
);

return
strtr($string, $table);
}

?>
5
horak.jan AT centrum.cz
17 年前
這是一個將中歐 Windows 字元集 (cp1250) 轉換為 PHP 腳本所使用的字元集的函數。

<?php
function cp1250_to_utf2($text){
$dict = array(chr(225) => 'á', chr(228) => 'ä', chr(232) => 'č', chr(239) => 'ď',
chr(233) => 'é', chr(236) => 'ě', chr(237) => 'í', chr(229) => 'ĺ', chr(229) => 'ľ',
chr(242) => 'ň', chr(244) => 'ô', chr(243) => 'ó', chr(154) => 'š', chr(248) => 'ř',
chr(250) => 'ú', chr(249) => 'ů', chr(157) => 'ť', chr(253) => 'ý', chr(158) => 'ž',
chr(193) => 'Á', chr(196) => 'Ä', chr(200) => 'Č', chr(207) => 'Ď', chr(201) => 'É',
chr(204) => 'Ě', chr(205) => 'Í', chr(197) => 'Ĺ', chr(188) => 'Ľ', chr(210) => 'Ň',
chr(212) => 'Ô', chr(211) => 'Ó', chr(138) => 'Š', chr(216) => 'Ř', chr(218) => 'Ú',
chr(217) => 'Ů', chr(141) => 'Ť', chr(221) => 'Ý', chr(142) => 'Ž',
chr(150) => '-');
return
strtr($text, $dict);
}
?>
6
Annubis
6 年前
因為我發現很難找到多位元組安全的 strtr,而且我找到的解決方案沒有幫助,所以我寫了這個函數。我不知道它在非拉丁字符的情況下如何運作,但它對我使用西班牙/法語 utf8 有用,我希望它對某些人有幫助...
<?php
if(!function_exists('mb_strtr')) {
function
mb_strtr ($str, $from, $to = null) {
if(
is_array($from)) {
$from = array_map('utf8_decode', $from);
$from = array_map('utf8_decode', array_flip ($from));
return
utf8_encode (strtr (utf8_decode ($str), array_flip ($from)));
}
return
utf8_encode (strtr (utf8_decode ($str), utf8_decode($from), utf8_decode ($to)));
}
}
?>
8
Michael Schuijff
13 年前
我發現這種方法通常比 strtr() 快,而且不會在你的字串中重複更改相同的東西(與 str_replace() 相反,後者會按照你輸入的陣列順序覆寫東西)

<?php
function replace ($text, $replace) {
$keys = array_keys($replace);
$length = array_combine($keys, array_map('strlen', $keys));
arsort($length);

$array[] = $text;
$count = 1;
reset($length);
while (
$key = key($length)) {
if (
strpos($text, $key) !== false) {
for (
$i = 0; $i < $count; $i += 2) {
if ((
$pos = strpos($array[$i], $key)) === false) continue;
array_splice($array, $i, 1, array(substr($array[$i], 0, $pos), $replace[$key], substr($array[$i], $pos + strlen($key))));
$count += 2;
}
}
next($length);
}
return
implode($array);
}
?>
12
dot dot dot dot dot alexander at gmail dot com
16 年前
好的,我除錯了這個函式(有一些錯誤)
這是它

if(!function_exists("stritr")){
function stritr($string, $one = NULL, $two = NULL){
/*
stritr - strtr 的不區分大小寫版本
作者:Alexander Peev
發佈在 PHP.NET
*/
if( is_string( $one ) ){
$two = strval( $two );
$one = substr( $one, 0, min( strlen($one), strlen($two) ) );
$two = substr( $two, 0, min( strlen($one), strlen($two) ) );
$product = strtr( $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two ) );
return $product;
}
else if( is_array( $one ) ){
$pos1 = 0;
$product = $string;
while( count( $one ) > 0 ){
$positions = array();
foreach( $one as $from => $to ){
if( ( $pos2 = stripos( $product, $from, $pos1 ) ) === FALSE ){
unset( $one[ $from ] );
}
else{
$positions[ $from ] = $pos2;
}
}
if( count( $one ) <= 0 )break;
$winner = min( $positions );
$key = array_search( $winner, $positions );
$product = ( substr( $product, 0, $winner ) . $one[$key] . substr( $product, ( $winner + strlen($key) ) ) );
$pos1 = ( $winner + strlen( $one[$key] ) );
}
return $product;
}
else{
return $string;
}
}/* endfunction stritr */
}/* endfunction exists stritr */
5
elloromtz at gmail dot com
14 年前
如果您提供 3 個參數,且第 2 個參數為陣列,`strtr` 會從「Array」中搜尋 "A"(因為您將其視為純量字串),並將其替換為第 3 個參數。

`strtr('Analogy', array('x'=>'y'), '_'); //'_nalogy'`

所以實際上,上面的程式碼和以下程式碼效果相同:

`strtr('Analogy', 'A' , '_');`
6
dcz at phpbb-seo dot com
11 年前
當 `$replace_pairs` 包含陣列時,即使未使用,`strstr` 在 PHP 5.5.0 版本也會發出通知。

至少在 5.3.2 版本中,不會有此情況,但我不確定此通知是否確切是在 5.5.0 版本加入的。

<?php
$str
= 'hi all, I said hello';
$replace_pairs = array(
'all' => 'everybody',
'unused' => array('somtehing', 'something else'),
'hello' => 'hey',
);
// php 5.5.0 Notice: Array to string conversion in test.php on line 8
echo strtr($str, $replace_pairs); // hi everybody, I said hey
?>

由於結果仍然正確,`@strstr` 看起來是一個可行的解決方案。
6
Tedy
12 年前
由於 `strtr()` 比 `strlwr` 快兩倍,我決定編寫自己的小寫化函式,該函式也處理 UTF-8 字元。

<?php

function strlwr($string, $utf = 1)
{
$latin_letters = array('Ă' => 'a',
'Â' => 'a',
'Î' => 'i',
'Ș' => 's',
'Ş' => 's',
'Ț' => 't',
'Ţ' => 't');

$utf_letters = array('Ă' => 'ă',
'Â' => 'â',
'Î' => 'î',
'Ș' => 'ș',
'Ş' => 'ş',
'Ț' => 'ț',
'Ţ' => 'ţ');

$letters = array('A' => 'a',
'B' => 'b',
'C' => 'c',
'D' => 'd',
'E' => 'e',
'F' => 'f',
'G' => 'g',
'H' => 'h',
'I' => 'i',
'J' => 'j',
'K' => 'k',
'L' => 'l',
'M' => 'm',
'N' => 'n',
'O' => 'o',
'P' => 'p',
'Q' => 'q',
'R' => 'r',
'S' => 's',
'T' => 't',
'U' => 'u',
'V' => 'v',
'W' => 'w',
'X' => 'x',
'Y' => 'y',
'Z' => 'z');

return (
$utf == 1) ? strtr($string, array_merge($utf_letters, $letters)) : strtr($string, array_merge($latin_letters, $letters));
}

?>

如果您不設定第二個參數,這會將每個字元(甚至是 UTF-8 字元)都轉換為小寫,或者僅將 UTF-8 字元轉換為其特定的拉丁字元(例如,用於製作友善網址時)。

我使用了羅馬尼亞字元,但當然,您可以新增自己的本地字元。

請隨意使用/修改此函式。希望它對您有幫助。
4
troelskn at gmail dot com
16 年前
這裡有另一個轉錄函式。此函式將 cp1252(又稱 Windows-1252)轉換為 iso-8859-1(又稱 latin1,PHP 的預設字元集)。它只轉錄 cp1252 特有的少數特殊字元。

function transcribe_cp1252_to_latin1($cp1252) {
return strtr(
$cp1252,
array(
"\x80" => "e", "\x81" => " ", "\x82" => "'", "\x83" => 'f',
"\x84" => '"', "\x85" => "...", "\x86" => "+", "\x87" => "#",
"\x88" => "^", "\x89" => "0/00", "\x8A" => "S", "\x8B" => "<",
"\x8C" => "OE", "\x8D" => " ", "\x8E" => "Z", "\x8F" => " ",
"\x90" => " ", "\x91" => "`", "\x92" => "'", "\x93" => '"',
"\x94" => '"', "\x95" => "*", "\x96" => "-", "\x97" => "--",
"\x98" => "~", "\x99" => "(TM)", "\x9A" => "s", "\x9B" => ">",
"\x9C" => "oe", "\x9D" => " ", "\x9E" => "z", "\x9F" => "Y"));
4
martin[dot]pelikan[at]gmail[dot]com
18 年前
// 如果您對行尾的 Windows ^M 字元感到困擾,
// 以下兩行程式碼適合您
$trans = array("\x0D" => "");
$text = strtr($orig_text,$trans);

// 請注意,ctrl+M(在 vim 中稱為 ^M)的十六進位碼為 0x0D
5
Sidney Ricardo
16 年前
這對我來說運作良好

<?php
function normaliza ($string){
$a = 'ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ
ßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿŔŕ'
;
$b = 'aaaaaaaceeeeiiiidnoooooouuuuy
bsaaaaaaaceeeeiiiidnoooooouuuyybyRr'
;
$string = utf8_decode($string);
$string = strtr($string, utf8_decode($a), $b);
$string = strtolower($string);
return
utf8_encode($string);
}
?>
4
dot dot dot dot dot alexander at gmail dot com
16 年前
這是我一直需要的 `stritr`... 我在 15 分鐘內寫完它... 但只有在靈感來臨時才完成。希望您覺得它有幫助,並樂在其中...
<?php
if(!function_exists("stritr")){
function
stritr($string, $one = NULL, $two = NULL){
/*
stritr - 大小寫不敏感版本的 strtr
作者:Alexander Peev
發布於 PHP.NET
*/
if( is_string( $one ) ){
$two = strval( $two );
$one = substr( $one, 0, min( strlen($one), strlen($two) ) );
$two = substr( $two, 0, min( strlen($one), strlen($two) ) );
$product = strtr( $string, ( strtoupper($one) . strtolower($one) ), ( $two . $two ) );
return
$product;
}
else if(
is_array( $one ) ){
$pos1 = 0;
$product = $string;
while(
count( $one ) > 0 ){
$positions = array();
foreach(
$one as $from => $to ){
if( (
$pos2 = stripos( $product, $from, $pos1 ) ) === FALSE ){
unset(
$one[ $from ] );
}
else{
$positions[ $from ] = $pos2;
}
}
$winner = min( $positions );
$key = array_search( $winner, $positions );
$product = ( substr( $product, 0, $winner ) . $positions[$key] . substr( $product, ( $winner + strlen($key) ) ) );
$pos1 = ( $winner + strlen( $positions[$key] ) );
}
return
$product;
}
else{
return
$string;
}
}
/* endfunction stritr */
}/* endfunction exists stritr */
?>
3
doydoy44
11 年前
VOVA 的範例 (https://php.dev.org.tw/manual/fr/function.strtr.php#111968) 不錯,但結果是錯誤的
他的範例沒有取代字串。

<?php
function f1_strtr() {
for(
$i=0; $i<1000000; ++$i) {
$new_string = strtr("aboutdealers.com", array(".com" => ""));
}
return
$new_string;
}
function
f2_str_replace() {
for(
$i=0; $i<1000000; ++$i) {
$new_string = str_replace( ".com", "", "aboutdealers.com");
}
return
$new_string;
}
$start = microtime(true);
$strtr = f1_strtr();
$stop = microtime(true);
$time_strtr = $stop - $start;

$start = microtime(true);
$str_replace = f2_str_replace();
$stop = microtime(true);
$time_str_replace = $stop - $start;


echo
'time strtr : ' . $time_strtr . "\tresult :" . $strtr . "\n";
echo
'time str_replace : ' . $time_str_replace . "\tresult :" . $str_replace . "\n";
echo
'time strtr > time str_replace => ' . ($time_strtr > $time_str_replace);
?>
--------------------------------------
time strtr : 3.9719619750977 result :aboutdealers
time str_replace : 2.9930369853973 result :aboutdealers
time strtr > time str_replace => 1

str_replace 比 strtr 快
3
qeremy [atta] gmail [dotta] com
11 年前
很奇怪,但如果像下面這樣使用,且檔案是以 UTF-8 編碼時,strtr 會損壞字元;

<?php
$str
= 'Äbc Äbc';
echo
strtr($str, 'Ä', 'a');
// 輸出:a�bc a�bc
?>

一個簡單的解決方案;

<?php
function strtr_unicode($str, $a = null, $b = null) {
$translate = $a;
if (!
is_array($a) && !is_array($b)) {
$a = (array) $a;
$b = (array) $b;
$translate = array_combine(
array_values($a),
array_values($b)
);
}
// 再次奇怪,但在這種情況下接受陣列
return strtr($str, $translate);
}

$str = 'Äbc Äbc';
echo
strtr($str, 'Ä', 'a') ."\n";
echo
strtr_unicode($str, 'Ä', 'a') ."\n";
echo
strtr_unicode($str, array('Ä' => 'a')) ."\n";
// 輸出
// a�bc a�bc
// abc abc
// abc abc
?>
2
joeldegan AT yahoo
18 年前
在嘗試使用 strtr 從貼到表單中的內容中去除 MS Word 格式時,我最終提出了這個..

它會移除所有非標準的 ASCII 字元,保留 HTML 程式碼等,但會去除所有在 Firefox 中無法顯示的字元。

如果你在 Firefox 中查看此頁面,你會看到大量的「問號」字元,因此無法複製並貼上這些字元來從字串中移除它們... (這很好地解決了這個問題,儘管我承認可以做得更好)

<?
function fixoutput($str){
$good[] = 9; #tab
$good[] = 10; #nl
$good[] = 13; #cr
for($a=32;$a<127;$a++){
$good[] = $a;
}
$len = strlen($str);
for($b=0;$b < $len+1; $b++){
if(in_array(ord($str[$b]), $good)){
$newstr .= $str[$b];
}//fi
}//rof
return $newstr;
}
?>
1
Romain
10 年前
<?php
/**
* 清理字串,
* 最小化並移除空格、重音和其他字元
*
* @param string $string
* @return string
*/
public function mb_strtoclean($string){
// 要清理的值 (轉換)
$unwanted_array = array( 'Š'=>'S', 'š'=>'s', 'Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A', 'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E',
'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I', 'Ï'=>'I', 'Ñ'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U',
'Ú'=>'U', 'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss', 'à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a', 'å'=>'a', 'æ'=>'a', 'ç'=>'c',
'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i', 'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o',
'ö'=>'o', 'ø'=>'o', 'ù'=>'u', 'ú'=>'u', 'û'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y',
' ' => '', '_' => '', '-' => '', '.'=> '', ',' => '', ';' => '');

return
mb_strtolower(strtr($string, $unwanted_array ));
}
1
gabi at unica dot edu
22 年前
要將特殊字元轉換為 HTML 實體,你可以結合 `strtr` 和 `get_html_translation_table(HTML_ENTITIES)` 來使用。

$trans = get_html_translation_table(HTML_ENTITIES);
$html_code = strtr($html_code, $trans);

這會將 $html_code 中的 ? 替換為 &Aacute; 等。
1
tomhmambo at seznam dot cz
18 年前
<?
// Windows-1250 轉換為 ASCII
// 此函數會將所有 Windows-1250 的重音字元替換為
// 其非重音的等價字元。對捷克語和斯洛伐克語很有用。

function win2ascii($str) {

$str = StrTr($str,
"\xE1\xE8\xEF\xEC\xE9\xED\xF2",
"\x61\x63\x64\x65\x65\x69\x6E");

$str = StrTr($str,
"\xF3\xF8\x9A\x9D\xF9\xFA\xFD\x9E\xF4\xBC\xBE",
"\x6F\x72\x73\x74\x75\x75\x79\x7A\x6F\x4C\x6C");

$str = StrTr($str,
"\xC1\xC8\xCF\xCC\xC9\xCD\xC2\xD3\xD8",
"\x41\x43\x44\x45\x45\x49\x4E\x4F\x52");

$str = StrTr($str,
"\x8A\x8D\xDA\xDD\x8E\xD2\xD9\xEF\xCF",
"\x53\x54\x55\x59\x5A\x4E\x55\x64\x44");

return $str;
}
?>
0
Anonymous
19 年前
如果你要大量呼叫 `strtr`,請考慮改用 `str_replace`,因為它速度快得多。我這樣做就將執行時間減少了一半。

<?
// 例如,取代
$s=strtr($s,$replace_array);

// 使用
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
0
ktogias at math dot upatras dot gr
20 年前
此函數適用於
對希臘文 (iso8859-7) 文字進行不區分重音的正規表示式
搜尋
(在你的瀏覽器中選擇「檢視」->「字元編碼」->「希臘文 (iso8859-7)」
即可看到正確的希臘字元)

function gr_regexp($mystring){
$replacement=array(
array("?","?","?","?"),
array("?","?","?","?"),
array("?","?","?","?"),
array("?","?","?","?","?","?"),
array("?","?","?","?"),
array("?","?","?","?","?","?"),
array("?","?","?","?")
);
foreach($replacement as $group){
foreach($group as $character){
$exp="[";
foreach($group as $expcharacter){
$exp.=$expcharacter;
}
$exp.="]";
$trans[$character]=$exp;
}
}
$temp=explode(" ", $mystring);
for ($i=0;$i<sizeof($temp);$i++){
$temp[$i]=strtr($temp[$i],$trans);
$temp[$i]=addslashes($temp[$i]);
}
return implode(".*",$temp);
}

$match=gr_regexp("????????????????????? ??? ????????");

//下一個查詢字串可以傳送到 MySQL
透過 mysql_query()
$query=
"Select `column` from `table` where `column2` REGEXP
'".$match."'";
0
j at pureftpd dot org
21 年前
這是一個非常有用的函數,可將 Microsoft 字元轉換為 Latin 15,讓大家在網頁中不再看到方塊而不是字元。

function demicrosoftize($str) {
return strtr($str,
"\x82\x83\x84\x85\x86\x87\x89\x8a" .
"\x8b\x8c\x8e\x91\x92\x93\x94\x95" .
"\x96\x97\x98\x99\x9a\x9b\x9c\x9e\x9f",
"'f\".**^\xa6<\xbc\xb4''" .
"\"\"---~ \xa8>\xbd\xb8\xbe");
}
0
bisqwit at iki dot fi
22 年前
#!/bin/sh
# 這個 shell 腳本會產生一個 strtr() 呼叫
# 以從一個字元集轉換為另一個字元集。
# 需要:gnu recode、perl、php 命令列二進制檔
#
# 用法
# 將 set1 和 set2 設定為你偏好的值
# (不支援多位元組字元集)
# 並執行腳本。腳本會輸出
# 一個 strtr() php 程式碼供你使用。
#
# 範例設定為產生
# cp437..latin9 轉換程式碼。
#
set1=cp437
set2=iso-8859-15
result="`echo '<? for($c=32;$c<256;$c++)'\
'echo chr($c);'\
|php -q|recode -f $set1..$set2`"
echo "// 這個 php 函數呼叫會將 $string 從 $set1 轉換為 $set2";
cat <<EOF | php -q
<?php
\$set1='`echo -n "$result"\
|perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`'
;
\
$set2='`echo -n "$result"|recode -f $set2..$set1\
|perl -pe "s/([\\\\\'])/\\\\\\\\\\$1/g"`'
;
\
$erase=array();
\
$l=strlen(\$set1);
for(\
$c=0;\$c<\$l;++\$c)
if(\
$set1[\$c]==\$set2[\$c])\$erase[\$set1[\$c]]='';
if(
count(\$erase))
{
\
$set1=strtr(\$set1,\$erase);
\
$set2=strtr(\$set2,\$erase);
}
if(!
strlen(\$set1))echo 'IRREVERSIBLE';else
echo
"strtr(\\\$string,\n '",
ereg_replace('([\\\\\\'])', '\\\\\\1', \$set2),
"'
,\n '",
ereg_replace('
([\\\\\\'])', '\\\\\\1', \$set1),
"');";
EOF
-1
ajitsingh4u at gmail dot com
17 年前
/**
* 將特殊字元替換為單引號、雙引號和逗號,用於字元集 iso-8859-1
*
* replaceSpecialChars()
* @param string $str
* @return string
*/
function replaceSpecialChars($str)
{
// `(96) ’(130) „(132) ‘(145) ’(146) “(147) ”(148) ´(180) // 這些字元的等效 ASCII 值。
$str = strtr($str, "`’„‘’´", "'','''");
$str = strtr($str, '“”', '""');
return $str;
}
-1
patrick at p-roocks dot de
19 年前
如同 Daijoubu 建議的,對於大型陣列/主體,請使用 str_replace 而非此函式。我剛試過一個包含 60 個元素的陣列、一個長度為 8KB 的字串,而 str_replace 的執行時間快了 20 倍!

Patrick
-1
ru dot dy at gmx dot net
19 年前
在這裡發布變音符號會導致混亂。以下是僅使用 preg_replace 的相同函式版本
<?php
function getRewriteString($sString) {
$string = strtolower(htmlentities($sString));
$string = preg_replace("/&(.)(uml);/", "$1e", $string);
$string = preg_replace("/&(.)(acute|cedil|circ|ring|tilde|uml);/", "$1", $string);
$string = preg_replace("/([^a-z0-9]+)/", "-", html_entity_decode($string));
$string = trim($string, "-");
return
$string;
}
?>
-1
symlink23-remove-my-spleen at yahoo dot com
22 年前
正如 str_rot13 文件中所述,某些伺服器不提供 str_rot13() 函式。但是,strtr 的存在使得建立自己的副本變得很容易

if (!function_exists('str_rot13')) {
function str_rot13($str) {
$from = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$to = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';

return strtr($str, $from, $to);
}
}

這適用於非常輕量的「加密」,例如從垃圾郵件機器人隱藏電子郵件地址(然後在郵件類別中對它們進行解碼)。

$mail_to=str_rot13("$mail_to");
-1
erik at eldata dot se
23 年前
作為上述第一個註釋中提到的尚未存在的函式 stritr 的替代方案,您可以輕鬆地執行此操作

strtr("abc","ABCabc","xyzxyz")

或更一般來說

strtr("abc",
strtoupper($fromchars).strtolower($fromchars),
$tochars.$tochars);

只是個想法。
-1
Anonymous
4 年前
字串形式無法移除字元,但陣列形式可以。
-2
tekintian#gmail.com
4 年前
/**
*
* 將一個字串中含有全形的數字字元、字母、空格或 '%+-()' 字元轉換為相應的半形字元
* @author tekintian#gmail.com
* @param string $str 待轉換字串
*
* @return string $str 處理後字串
*/
function str2byte_convert(String $str):String {
$arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4',
'5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9',
'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E',
'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J',
'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O',
'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T',
'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y',
'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd',
'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i',
'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n',
'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's',
't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x',
'y' => 'y', 'z' => 'z',
'(' => '(', ')' => ')', '〔' => '[', '〕' => ']', '【' => '[',
'】' => ']', '〖' => '[', '〗' => ']', '“' => '[', '”' => ']',
'‘' => '[', '’' => ']', '{' => '{', '}' => '}', '《' => '<',
'》' => '>',
'%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-',
':' => ':', '。' => '.', '、' => ',', ',' => '.', '、' => '.',
';' => ',', '?' => '?', '!' => '!', '…' => '-', '‖' => '|',
'”' => '"', '’' => '`', '‘' => '`', '|' => '|', '〃' => '"',
' ' => ' ');

return strtr($str, $arr);
}
-3
Fernando "Malk" Piancastelli
21 年前
這是一個將換行符替換為 html <p> 標籤的函式。此函式最初設計用於接收表單在「插入新通知」頁面中鍵入的文字,並將其放入資料庫中,然後「通知」頁面可以使用預先格式化的段落標籤,而不是瀏覽器上不會顯示的換行符。此函式也會移除使用者在表單中鍵入的重複換行符。

function break_to_tags(&$text) {

// 尋找並移除重複的換行符

$double_break = array("\r\n\r\n" => "\r\n");
do {
$text = strtr($text, $double_break);
$position = strpos($text, "\r\n\r\n");
} while ($position !== false);

// 尋找並將剩餘的換行符替換為 <p> 標籤

$change = array("\r\n" => "<p>");
$text = strtr($text, $change);
}

[]'s
Fernando
To Top