Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Обработать всё, что в скобках.
 
 автор: coloboc66   (17.06.2013 в 13:56)   письмо автору
 
 

Есть строка произвольной длины вида:
$str="xxx [abc] xxxxxx [cbb]"; //и так далее
echo $str=func($str);
function func($txt){
$arr1=aray("a", "b", "c");
$arr2=aray("а", "б", "ц");
//Далее нужно как-то заменить латиницу на кириллицу во всех подстроках, ограниченных квадратными скобками, и вернуть строку для печати, сохранив квадратные скобки.
....
return $text;
}

Т.е. должно получиться $text="xxx [абц] xxxxxx [цбб]";
Как это сделать?
Спасибо.

  Ответить  
 
 автор: confirm   (17.06.2013 в 14:22)   письмо автору
 
   для: coloboc66   (17.06.2013 в 13:56)
 

А к чему массивы в функции? Вам надо где заменить - в строке или в массивах этих?

  Ответить  
 
 автор: coloboc66   (17.06.2013 в 14:50)   письмо автору
 
   для: confirm   (17.06.2013 в 14:22)
 

Массивы - это соответствия символов для замены, т.е. грубо говоря нужно транскрипировать в кириллицу всё, что в квадратных скобках.
foreach ($arr1 as $key=>$value){$txt=str_replace($arr1[], $arr2[], $txt); /*и пошла замена*/}

  Ответить  
 
 автор: confirm   (17.06.2013 в 15:12)   письмо автору
 
   для: coloboc66   (17.06.2013 в 14:50)
 

Ну опишите массив, ключи которого латиница, а значения кириллица, и получайте. У вас же все в по массивам разложено и так.

  Ответить  
 
 автор: coloboc66   (17.06.2013 в 16:36)   письмо автору
 
   для: confirm   (17.06.2013 в 15:12)
 

Я могу написать, но только чтобы транскрипировалась ВСЯ строка. А мне нужно не вся, а только подстроки в квадратных скобках. В этом и проблема.

  Ответить  
 
 автор: confirm   (17.06.2013 в 16:46)   письмо автору
 
   для: coloboc66   (17.06.2013 в 16:36)
 

Так вы получаете эти массивы из строки или нет? Если получаете, то дальше так:
<?
$a 
= array('a'=>'а','b'=>'б','c'=>'ц','d'=>'д','e'=>'е','f'=>'ф'); //массив замены
$w = array('a','d','f'); //полученный массив из строки
//замена
echo '['.implode(array_intersect_key($aarray_flip($w))).']';

Если не знаете как получить, то рег выражением между [ и ] запомнить, затем можно с модификатором e выполнить сразу функцию, которая заменит по выше показанному (предварительно разбив на массив) и вернет результат.

Так что пишите, что именно у вас не получается, и что у вас уже есть.

  Ответить  
 
 автор: coloboc66   (17.06.2013 в 17:40)   письмо автору
 
   для: confirm   (17.06.2013 в 16:46)
 

Я не получаю эти массивы из строки, это просто как пример того, как я бы делал соответствия между латинскими и кириллическими символами. Сформулирую задачу проще:
Есть строка
$str="кир или lat [latinica] кир или lat [latinica] кир или lat [latinica]";

Мне нужно получить из неё строку:
$str="кир или lat [латиница] кир или lat [латиница] кир или lat [латиница]";

Само собой, и в скобках, и не в скобках идёт разный текст, а не повторяется одно и то же.
ВСЁ.

  Ответить  
 
 автор: confirm   (17.06.2013 в 18:18)   письмо автору
 
   для: 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;

  Ответить  
 
 автор: coloboc66   (18.06.2013 в 10:24)   письмо автору
 
   для: confirm   (17.06.2013 в 18:18)
 

А нельзя этот код привести к уже существующим у меня ДВУМ массивам для сопоставления символов, вот таких:
$a1=array("a", "b", "c" и так далее);
$a2=array("а", "б", "ц" и так далее);

?
Потому что эти массивы я уже использую как глобальные переменные в других функциях и хотел бы особо ничего не менять.
Т.е. Вам не нужно описывать эти массивы, я опишу их сам. Просто прошу вас переписать код написанной вами функции так, чтобы использовать не один ваш массив $a, а два моих $a1 и $a2.

  Ответить  
 
 автор: confirm   (18.06.2013 в 11:02)   письмо автору
 
   для: coloboc66   (18.06.2013 в 10:24)
 

Можно, но вряд ли целесообразно. Во-первых, если допустить ошибку несоответствия в этих массивах, то все пойдет вкривь вкось. Во-вторых, для этого потребуется либо получать ключ символа в первом массиве, а потом по нему получать значение из второго массива, либо перед операцией получать комбинированный массив из этих двух. Для второго случая не дай бог ошибка выше описанная, все пойдет накосяк.
Ну и последний аргумент - если есть набор 1, который должен соответствовать набору 2, то и ежу понятно, что эти наборы должны быть одним целым - массивом ключ->значение. По каким соображениям вы решили их разлучить?
Не выдумывайте проблем, лучше перепишите сразу все по разумному, а если в каком либо месте из этого набора потребуется только одна его часть, то есть array_keys() и array_values().

  Ответить  
 
 автор: coloboc66   (18.06.2013 в 13:37)   письмо автору
 
   для: confirm   (18.06.2013 в 11:02)
 

Чего-то у меня ваш код не работает. Может, из-за того, что у меня всё в UTF-8 ?

  Ответить  
 
 автор: confirm   (18.06.2013 в 16:26)   письмо автору
 
   для: coloboc66   (18.06.2013 в 13:37)
 

Для utf требуется модификатор u в шаблоне.

  Ответить  
 
 автор: coloboc66   (18.06.2013 в 18:01)   письмо автору
 
   для: confirm   (18.06.2013 в 16:26)
 

Это как?

  Ответить  
 
 автор: confirm   (18.06.2013 в 18:02)   письмо автору
 
   для: coloboc66   (18.06.2013 в 18:01)
 

"/\[([a-z]+)\]/iu"


ps Хотя для английского без разницы, он и в utf один байт занимает, так что по идее, если вы ничего не меняете, то все должно работать. Может быть причина в ином, у вас версия php старая и не поддерживает замыкания, то есть такое объявление анонимных функций.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования