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}
)不过,最好的做法是尽可能少地对正则表达式引入歧义。