Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 映射除大括号内的字符以外的所有字符_Php_Regex - Fatal编程技术网

Php 映射除大括号内的字符以外的所有字符

Php 映射除大括号内的字符以外的所有字符,php,regex,Php,Regex,我有两个音译数组 $latin = ['dž', 'lj', 'nj', 'a', 'b', 'c', 'č', 'ć', 'd', 'đ', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 'š', 't', 'u', 'v', 'z', 'ž', 'DŽ', 'LJ', 'NJ', 'Dž', 'Lj', 'Nj', 'A', 'B'

我有两个音译数组

$latin = ['dž', 'lj', 'nj',
    'a', 'b', 'c', 'č', 'ć',
    'd', 'đ', 'e', 'f', 'g',
    'h', 'i', 'j', 'k', 'l',
    'm', 'n', 'o', 'p', 'r', 
    's', 'š', 't', 'u', 'v', 
    'z', 'ž',
    'DŽ', 'LJ', 'NJ', 'Dž', 'Lj', 'Nj',
    'A', 'B', 'C', 'Č', 'Ć',
    'D', 'Đ', 'E', 'F', 'G',
    'H', 'I', 'J', 'K', 'L',
    'M', 'N', 'O', 'P', 'R', 
    'S', 'Š', 'T', 'U', 'V', 
    'Z', 'Ž'
];

$cyrillic = ['џ', 'љ', 'њ',
    'a', 'б', 'ц', 'ч', 'ћ',
    'д', 'ђ', 'e', 'ф', 'г',
    'x', 'и', 'j', 'к', 'л',
    'm', 'н', 'o', 'п', 'p', 
    'c', 'ш', 'т', 'y', 'b', 
    'з', 'ж',
    'Џ', 'Љ', 'Њ', 'Џ', 'Љ', 'Њ',
    'A', 'Б', 'Ц', 'Ч', 'Ћ',
    'Д', 'Ђ', 'E', 'Ф', 'Г',
    'X', 'И', 'J', 'K', 'Л',
    'M', 'H', 'O', 'П', 'P', 
    'C', 'Ш', 'T', 'Y', 'B', 
    'З', 'Ж'
];
因此,当我使用str_replace($latin,$cyrillic,$string)时,效果非常好

但是
string
可能是这样的:

$string = 'Today is {day_name} and time is {time}';
是否可以映射除大括号内的字符以外的所有字符

例如:

$string = 'Today is {day_name} and time is {time}';
echo str_replace($latin, $cyrillic, $string);
使用

请参阅,结果:
到砦ay砦c{day_name}a砦砦me砦c{time}

在这里,我将两个数组组合成一个带有键和值的数组,然后匹配除换行符(=key)之外的任何字符(添加
/s
修饰符以匹配所有字符),并检查数组中是否存在键。如果是,请更换

正则表达式匹配:

  • \{[^}]*}(*SKIP)(*F)
    -一个子串,以
    {
    开头,后跟0个或多个字符,而不是
    }
    ,然后匹配一个结束符
    }
    ,由于动词
    (*SKIP)(*FAIL)
  • |
    -或
  • -除换行符外的任何字符
请参阅。

使用

请参阅,结果:
到砦ay砦c{day_name}a砦砦me砦c{time}

在这里,我将两个数组组合成一个带有键和值的数组,然后匹配除换行符(=key)之外的任何字符(添加
/s
修饰符以匹配所有字符),并检查数组中是否存在键。如果是,请更换

正则表达式匹配:

  • \{[^}]*}(*SKIP)(*F)
    -一个子串,以
    {
    开头,后跟0个或多个字符,而不是
    }
    ,然后匹配一个结束符
    }
    ,由于动词
    (*SKIP)(*FAIL)
  • |
    -或
  • -除换行符外的任何字符
请参阅。

您可以使用{}使用-

然后有选择地应用字符串替换逻辑。
类似这样的事情-

$string = "sad {day_name} and time is {time}";

// Split by the regex
$s_arr =preg_split(
    "/({[^}]*})/",
    $string,
    -1,
    PREG_SPLIT_DELIM_CAPTURE
);

// The string is split such that only odd numbers 
// constitute the split value
foreach($s_arr as $k=>&$m){
    if($k%2 === 0){
        $m = str_replace($latin, $cyrillic, $m);
    }
}
unset($m);

$resp_str = implode("", $s_arr);
echo $resp_str;
输出-

caд {day_name} aнд тиme иc {time}
您可以使用——

然后有选择地应用字符串替换逻辑。
类似这样的事情-

$string = "sad {day_name} and time is {time}";

// Split by the regex
$s_arr =preg_split(
    "/({[^}]*})/",
    $string,
    -1,
    PREG_SPLIT_DELIM_CAPTURE
);

// The string is split such that only odd numbers 
// constitute the split value
foreach($s_arr as $k=>&$m){
    if($k%2 === 0){
        $m = str_replace($latin, $cyrillic, $m);
    }
}
unset($m);

$resp_str = implode("", $s_arr);
echo $resp_str;
输出-

caд {day_name} aнд тиme иc {time}

显示你的代码,你已经尝试请塞尔比音译-好!我已经编写了从西里尔语到拉丁语的转换程序,效果很好,但是从拉丁语到西里尔语还有一些挑战,比如专有名称应该保留在原始名称中。@bub我已经在描述中添加了代码,说明您尝试过的代码是如何用塞尔维亚语音译的-很好!我已经编写了从西里尔文到拉丁文的转换程序,效果很好,但是从拉丁文到西里尔文还有一些挑战,比如专有名称应该保留在原始名称中。@bub我已经在description中添加了代码注意,否定字符类
[^}]*
比惰性点匹配更有效。您也不需要在PHP正则表达式中转义
}
。@Stribizev。。。使用否定字符类后,将步骤数从24降到12。。。谢谢:)请注意,求反字符类
[^}]*
比惰性点匹配更有效。您也不需要在PHP正则表达式中转义
}
。@Stribizev。。。使用否定字符类后,将步骤数从24降到12。。。谢谢:)很乐意帮忙。请考虑接受最适合你的解决方案(见)。请注意,通常情况下,首先提供的正确答案是可以接受的。您也可以根据效率和其他因素进行选择。@Stribizev,我有一个问题
\{[^}]*}(*SKIP)(*F)
为什么模式开头有反斜杠?为了确保
{
被视为一个文字开头大括号。虽然PHP正则表达式引擎很聪明,可以理解如果大括号后面没有数字,它就不是限制量词(如
{1,4}
)不过,最好的做法是尽可能少地引入正则表达式。乐于助人。请考虑接受最适合你的解决方案(见)。注意,通常提供的正确答案是先接受的。你也可以根据效率和其他因素来选择。@ StrubHeHEV,我有一个问题…<代码> {[^ }] *}(*Skip)(*f)为什么在模式开头有反斜杠?为了确保
{
被视为一个文字开头大括号。虽然PHP正则表达式引擎很聪明,可以理解如果大括号后面没有数字,它就不是一个限制量词(如
{1,4}
)不过,最好的做法是尽可能少地对正则表达式引入歧义。