映射除花括号

时间:2015-11-20 10:03:22

标签: 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', '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 = 'Today is {day_name} and time is {time}';

是否可以映射除花括号内的所有字符。

这是一个例子:

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

2 个答案:

答案 0 :(得分:2)

使用

$arr = array_combine($latin, $cyrillic);
$string = 'Today is {day_name} and time is {time}';

echo preg_replace_callback('/\{[^}]*}(*SKIP)(*F)|./', function ($m) use ($arr) {
  return array_key_exists($m[0], $arr) ? $arr[$m[0]] : $m[0];
},
$string);

请参阅IDEONE demo,结果:Toдay иc {day_name} aнд тиme иc {time}

在这里,我将两个数组合并为1个数组,其中包含键和值,然后匹配任何字符,但是换行符(= key)(添加/s修饰符以匹配所有)并检查数组中是否存在键。如果是,请替换。

正则表达式匹配:

  • \{[^}]*}(*SKIP)(*F) - 以{开头的子字符串,后跟0 {+ 1}}以外的0个或更多字符,然后匹配结束},并从中忽略整个匹配的子字符串因动词}
  • 而匹配的值
  • (*SKIP)(*FAIL) - 或......
  • | - 任何字符,但换行符。

请参阅the regex demo on regex101.com

答案 1 :(得分:1)

您可以使用preg_split使用regex 通过$('#us3').locationpicker({ location: {latitude: lat, longitude: lon}, radius: 500, zoom: 16, inputBinding: { //latitudeInput: $('#us3-lat'), //longitudeInput: $('#us3-lon'), radiusInput: $("#us3-radius")//, //locationNameInput: $('#us3-address') }, enableAutocomplete: true, onchanged: function (currentLocation, radius, isMarkerDropped) { // Uncomment line below to show alert on each Location Changed event //alert("Location changed. New location (" + currentLocation.latitude + ", " + currentLocation.longitude + ")"); } }); });}); 封闭的字符拆分字符串 -

{}

然后有选择地应用字符串替换逻辑 像这样的东西 -

(\{[^}]*\})

输出 -

$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;