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 条备注

evan dot king at NOSPAM dot example dot com
9 年前
这是一个 strtr 的重要实际应用示例,其中 str_replace 将无法工作或会引入难以察觉的错误。

<?php

$strTemplate
= "我的名字是 :name,不是 :name2。";
$strParams = [
':name' => 'Dave',
'Dave' => ':name2 或 :password', // 一个在原本合理输入中出现的意外因素
':name2' => 'Steve',
':pass' => '7hf2348', // 可能不应该在这里出现的敏感数据
];

echo
strtr($strTemplate, $strParams);
// "我的名字是 Dave,不是 Steve。"

echo str_replace(array_keys($strParams), array_values($strParams), $strTemplate);
// "我的名字是 Steve 或 7hf2348word,不是 Steve 或 7hf2348word2。"

?>

任何时候,如果你尝试模板化一个字符串,并且不一定知道替换键/值是什么(或者完全理解其含义并控制其内容和顺序),`str_replace` 可能会由于它不会优先扩展最长的键而导致错误匹配键。

此外,`str_replace` 会替换之前的替换结果,这可能会导致意外的嵌套扩展。这样做可能会将错误的数据放入“子模板”,甚至让用户有机会提供暴露数据的输入(如果他们可以定义一些替换字符串)。

除非你需要并且知道它是安全的,否则不要支持递归扩展。当你支持它时,通过重复调用 `strtr` 直到不再发生扩展或达到合理的迭代限制来显式地执行此操作,这样结果就不会隐式地依赖于替换键的顺序。还要确保任何用户输入都将在任何敏感数据已经被扩展到输出中并且不再可用作输入之后,在一个隔离的步骤中进行扩展。

注意:在你的键周围使用某些字符来指定它们,也可以减少意外损坏输出的可能性,无论恶意触发还是其他原因。因此,在这些示例中使用了冒号前缀,你可以在接受替换输入到你的模板/翻译系统时轻松强制执行。
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')); // 效果更好
?>
allixsenos at gmail dot com
15年前
修复了下面编写的“规范化”函数,以包含斯拉夫拉丁字符……此外,它不再返回小写字母(你可以通过自己应用 `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);
}

?>
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);
}
?>
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)));
}
}
?>
Michael Schuijff
13年前
我发现这种方法通常比strtr()更快,并且不会在字符串中两次更改相同的内容(与str_replace()相反,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);
}
?>
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 */
elloromtz at gmail dot com
14年前
如果你提供3个参数,并且第二个参数是一个数组,strtr将搜索“Array”中的“A”(因为你将其视为标量字符串),并将其替换为第三个参数。

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

所以实际上上面的代码与下面的代码效果相同:

strtr('Analogy', 'A' , '_');
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`似乎是一个可行的解决方案。
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 字符转换为其特定的拉丁字符(例如,在创建友好 URL 时使用)。

我使用了罗马尼亚语字符,但当然,您可以添加您自己的本地字符。

随意使用/修改此函数。希望对您有所帮助。
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"));
martin[dot]pelikan[at]gmail[dot]com
18年前
// 如果你对 Windows 行尾的 ^M 字符感到困扰,
// 这两行代码是为你准备的
$trans = array("\x0D" => "");
$text = strtr($orig_text,$trans);

// 注意 ctrl+M(在 vim 中称为 ^M)的十六进制表示为 0x0D
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);
}
?>
dot dot dot dot dot alexander at gmail dot com
16年前
这是我一直需要的 strtr 函数……我在 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 */
?>
doydoy44
11年前
VOVA 的例子(https://php.net/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
'strtr 执行时间:' . $time_strtr . "\t结果:" . $strtr . "\n";
echo
'str_replace 执行时间:' . $time_str_replace . "\t结果:" . $str_replace . "\n";
echo
'strtr 执行时间 > str_replace 执行时间 => ' . ($time_strtr > $time_str_replace);
?>
--------------------------------------
strtr 执行时间:3.9719619750977 结果:aboutdealers
str_replace 执行时间:2.9930369853973 结果:aboutdealers
strtr 执行时间 > str_replace 执行时间 => 1

str_replace 比 strtr 更快
qeremy [atta] gmail [dotta] com
11年前
奇怪的是,如果像下面这样使用 strtr 并且文件使用 UTF-8 编码,它会损坏字符;

<?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
?>
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;
}
?>
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 ));
}
unica.edu邮箱的gabi
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; ”等。
seznam.cz邮箱的tomhmambo
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;
}
?>
匿名用户
19年前
如果您要多次调用`strtr`,请考虑使用`str_replace`,因为它速度更快。我只是做了这个,执行时间就减少了一半。

<?
// 例如,不要使用
$s=strtr($s,$replace_array);

// 而使用
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
upatras.gr邮箱的ktogias
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_query() 发送到 MySQL
通过 mysql_query()
$query=
"Select `column` from `table` where `column2` REGEXP
'".$match."'";
pureftpd.org邮箱的j
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");
}
iki.fi邮箱的bisqwit
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 函数调用将 $set1 中的 \$string 转换为 $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
[email protected]
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;
}
[email protected]
19年前
正如Daijoubu建议的那样,对于大型数组/主题,使用str_replace代替此函数。我刚在一个包含60个元素的数组和一个8KB长度的字符串上进行了测试,str_replace的执行速度提高了20倍!

Patrick
[email protected]
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;
}
?>
[email protected]
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");
[email protected]
23年前
作为上面第一个注释中提到的尚未存在的函数stritr的替代方案,您可以轻松地做到这一点

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

或者更通用

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

只是一个想法。
匿名用户
4年前
字符串形式的string不能移除字符,但数组形式可以。
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);
}
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