|
|
|
| Есть строка произвольной длины вида:
$str="xxx [abc] xxxxxx [cbb]"; //и так далее
echo $str=func($str);
function func($txt){
$arr1=aray("a", "b", "c");
$arr2=aray("а", "б", "ц");
//Далее нужно как-то заменить латиницу на кириллицу во всех подстроках, ограниченных квадратными скобками, и вернуть строку для печати, сохранив квадратные скобки.
....
return $text;
}
|
Т.е. должно получиться $text="xxx [абц] xxxxxx [цбб]";
Как это сделать?
Спасибо. | |
|
|
|
|
|
|
|
для: coloboc66
(17.06.2013 в 13:56)
| | А к чему массивы в функции? Вам надо где заменить - в строке или в массивах этих? | |
|
|
|
|
|
|
|
для: confirm
(17.06.2013 в 14:22)
| | Массивы - это соответствия символов для замены, т.е. грубо говоря нужно транскрипировать в кириллицу всё, что в квадратных скобках.
foreach ($arr1 as $key=>$value){$txt=str_replace($arr1[], $arr2[], $txt); /*и пошла замена*/} | |
|
|
|
|
|
|
|
для: coloboc66
(17.06.2013 в 14:50)
| | Ну опишите массив, ключи которого латиница, а значения кириллица, и получайте. У вас же все в по массивам разложено и так. | |
|
|
|
|
|
|
|
для: confirm
(17.06.2013 в 15:12)
| | Я могу написать, но только чтобы транскрипировалась ВСЯ строка. А мне нужно не вся, а только подстроки в квадратных скобках. В этом и проблема. | |
|
|
|
|
|
|
|
для: coloboc66
(17.06.2013 в 16:36)
| | Так вы получаете эти массивы из строки или нет? Если получаете, то дальше так:
<?
$a = array('a'=>'а','b'=>'б','c'=>'ц','d'=>'д','e'=>'е','f'=>'ф'); //массив замены
$w = array('a','d','f'); //полученный массив из строки
//замена
echo '['.implode(array_intersect_key($a, array_flip($w))).']';
|
Если не знаете как получить, то рег выражением между [ и ] запомнить, затем можно с модификатором e выполнить сразу функцию, которая заменит по выше показанному (предварительно разбив на массив) и вернет результат.
Так что пишите, что именно у вас не получается, и что у вас уже есть. | |
|
|
|
|
|
|
|
для: confirm
(17.06.2013 в 16:46)
| | Я не получаю эти массивы из строки, это просто как пример того, как я бы делал соответствия между латинскими и кириллическими символами. Сформулирую задачу проще:
Есть строка
$str="кир или lat [latinica] кир или lat [latinica] кир или lat [latinica]";
|
Мне нужно получить из неё строку:
$str="кир или lat [латиница] кир или lat [латиница] кир или lat [латиница]";
|
Само собой, и в скобках, и не в скобках идёт разный текст, а не повторяется одно и то же.
ВСЁ. | |
|
|
|
|
|
|
|
для: coloboc66
(17.06.2013 в 17:40)
| | Можно так, с некоторой поправкой выше показанного, так как я не учел, что символы могут повторяться, а это значит повтор ключа массива будет, следовательно некорректная замена может быть. Поэтому придется прибегнуть к циклу.
<?
$str="xxx [abc] xxxxxx [cbb]";
$a = array('a'=>'а','b'=>'б','c'=>'ц','d'=>'д','e'=>'е','f'=>'ф');
$str = preg_replace_callback("/\[([a-z]+)\]/i", function($v) use($a) {
$v = str_split($v[1]);
$s = $a[$v[0]];
while(next($v)) $s .= $a[current($v)];
return $s;
}, $str);
echo $str;
|
| |
|
|
|
|
|
|
|
для: confirm
(17.06.2013 в 18:18)
| | А нельзя этот код привести к уже существующим у меня ДВУМ массивам для сопоставления символов, вот таких:
$a1=array("a", "b", "c" и так далее);
$a2=array("а", "б", "ц" и так далее);
|
?
Потому что эти массивы я уже использую как глобальные переменные в других функциях и хотел бы особо ничего не менять.
Т.е. Вам не нужно описывать эти массивы, я опишу их сам. Просто прошу вас переписать код написанной вами функции так, чтобы использовать не один ваш массив $a, а два моих $a1 и $a2. | |
|
|
|
|
|
|
|
для: coloboc66
(18.06.2013 в 10:24)
| | Можно, но вряд ли целесообразно. Во-первых, если допустить ошибку несоответствия в этих массивах, то все пойдет вкривь вкось. Во-вторых, для этого потребуется либо получать ключ символа в первом массиве, а потом по нему получать значение из второго массива, либо перед операцией получать комбинированный массив из этих двух. Для второго случая не дай бог ошибка выше описанная, все пойдет накосяк.
Ну и последний аргумент - если есть набор 1, который должен соответствовать набору 2, то и ежу понятно, что эти наборы должны быть одним целым - массивом ключ->значение. По каким соображениям вы решили их разлучить?
Не выдумывайте проблем, лучше перепишите сразу все по разумному, а если в каком либо месте из этого набора потребуется только одна его часть, то есть array_keys() и array_values(). | |
|
|
|
|
|
|
|
для: confirm
(18.06.2013 в 11:02)
| | Чего-то у меня ваш код не работает. Может, из-за того, что у меня всё в UTF-8 ? | |
|
|
|
|
|
|
|
для: coloboc66
(18.06.2013 в 13:37)
| | Для utf требуется модификатор u в шаблоне. | |
|
|
|
|
|
|
|
для: confirm
(18.06.2013 в 16:26)
| | Это как? | |
|
|
|
|
|
|
|
для: coloboc66
(18.06.2013 в 18:01)
| |
ps Хотя для английского без разницы, он и в utf один байт занимает, так что по идее, если вы ничего не меняете, то все должно работать. Может быть причина в ином, у вас версия php старая и не поддерживает замыкания, то есть такое объявление анонимных функций. | |
|
|
|