strtr

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

strtr转换字符或替换子字符串

描述

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

备用签名(不支持命名参数)

strtr(string $string, array $replace_pairs): string

如果给定三个参数,则此函数返回 string 的副本,其中 from 中每个(单字节)字符的所有出现都已转换为 to 中的对应字符,即,每个 $from[$n] 的出现都已替换为 $to[$n],其中 $n 是两个参数中的有效偏移量。

如果 fromto 的长度不同,则两个参数中较长的参数中的额外字符将被忽略。 string 的长度将与返回值的长度相同。

如果给定两个参数,则第二个参数应该是 array,形式为 array('from' => 'to', ...)。返回值是一个 string,其中数组键的所有出现都被替换为相应的键值。最长的键将首先尝试。一旦子字符串被替换,它的新值将不再被搜索。

在这种情况下,键和值可以具有任何长度,只要没有空键;此外,返回值的长度可能与 string 的长度不同。但是,当所有键都具有相同大小的时候,此函数将是最有效的。

参数

string

要转换的 string

from

要转换为 tostring

to

替换 fromstring

replace_pairs

replace_pairs 参数可以用来代替 tofrom,在这种情况下,它是一个 array,形式为 array('from' => 'to', ...)

如果 replace_pairs 包含一个键,该键是一个空 string (""),则忽略该元素;从 PHP 8.0.0 开始,在这种情况下会引发 E_WARNING

返回值

返回转换后的 string

示例

示例 #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
= "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 直到不再发生扩展或达到合理的迭代限制为止来明确执行,这样结果就不会隐式依赖于替换键的顺序。还要确保所有用户输入都在任何敏感数据已扩展到输出中且不再可用作为输入的隔离步骤中进行扩展。

注意:在您的键周围使用某些字符(例如冒号前缀)来指定它们,还可以减少意外篡改输出的可能性,无论恶意触发还是其他原因。因此,这些示例中使用了冒号前缀,您可以在接受替换输入到您的模板/翻译系统时轻松强制执行。
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 年前
修复了下面编写的“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);
}

?>
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
5 年前
由于我在寻找一个多字节安全的 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
12 年前
我发现这种方法通常比 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
11 年前
由于 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
15 年前
这对我来说效果很好

<?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 年前
这是我一直需要的 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 */
?>
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
'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 快
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
9 年前
<?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 ));
}
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; 等。
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;
}
?>
Anonymous
19 年前
如果您要多次调用 strtr,请考虑使用 str_replace,因为它速度快得多。我只需这样做就将执行时间减少了一半。

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

// 使用
foreach($replace_array as $key=>$value) $s=str_replace($key,$value,$s);
?>
ktogias at math dot upatras dot gr
19 年前
此函数适用于
不区分重音的正则表达式
在希腊语(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."'";
j at pureftpd dot org
20 年前
这是一个非常有用的函数,可以将 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");
}
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
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;
}
patrick at p-roocks dot de
19 年前
正如 Daijoubu 所建议的,对于大型数组/主题,请使用 str_replace 代替此函数。 我刚刚尝试了一个包含 60 个元素的数组,一个包含 8KB 长度的字符串,str_replace 的执行时间快了 20 倍!

帕特里克
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;
}
?>
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");
erik at eldata dot se
22 年前
作为上面第一个笔记中提到的尚不存在的函数 stritr 的替代方案,您可以轻松地做到这一点

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

或者更通用

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

只是一个想法。
Anonymous
4 年前
字符串,字符串形式不能删除字符,但数组形式可以。
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
20 年前
以下是一个将换行符替换为 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
费尔南多
To Top