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

Форум PHP

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

 

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

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

тема: Как транскрипировать строку в кириллицу?
 
 автор: coloboc66   (13.06.2013 в 13:50)   письмо автору
 
 

Само по себе это не сложно. Но проблема в том, что в строке есть html-теги. Может, есть библиотечные функции PHP, которые эти теги игнорируют?
Спасибо.

  Ответить  
 
 автор: mihdan   (13.06.2013 в 14:13)   письмо автору
 
   для: coloboc66   (13.06.2013 в 13:50)
 

strip_tags поможет вам избавиться от тегов )

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

Эта функция просто вырезает теги. А мне нужно, чтобы они в строке оставались, но не транскрипировались.

  Ответить  
 
 автор: DangerBay   (13.06.2013 в 16:33)   письмо автору
 
   для: coloboc66   (13.06.2013 в 14:56)
 

Примерно так, если вложенность только 1-го уровня:
<?php
$text 
"Begin<p>Tekst123</p>test1";
$text.= "<span>Tekst456</span>test2";
$text.= "<strong>Tekst789</strong>End";

echo 
preg_replace_callback(
        
// Начало строки до первого тэга если есть
        
'|^([^<]*)|',
        
create_function(
            
'$matches',
            
'return translit($matches[1]);'
        
),
        
        
// Внутри тэгов и между ними
        
preg_replace_callback(
        
'|<([^>]+)>([^<]*)<([^>]+)>([^<]+)|',
        
create_function(
            
'$matches',
            
'return "<". $matches[1] . ">". translit($matches[2]) . "<" . $matches[3] . ">" . translit($matches[4]);'
        
),
        
        
// Текст после последнего тэга если есть
        
preg_replace_callback(
        
'|([^>]*)$|',
        
create_function(
            
'$matches',
            
'return translit($matches[1]);'
        
),
        
$text
    
)
    )
    );

Можно и одной регуляркой всё сделать при желании....
translit - функция транскрибирации
Если тэгов много неизвестного уровня вложенности, т.е. полноценный html-код, то дальше сами думайте и дорабатывайте.
Вообще-то если такая задача возникла то что-то делается неверно.
Никаких html-тэгов в такого рода данных быть не должно.

  Ответить  
 
 автор: coloboc66   (14.06.2013 в 16:47)   письмо автору
 
   для: DangerBay   (13.06.2013 в 16:33)
 

translit () - это должна быть моя самодельная функция?

  Ответить  
 
 автор: DangerBay   (14.06.2013 в 22:25)   письмо автору
 
   для: coloboc66   (14.06.2013 в 16:47)
 

Немного поправил и пример функции транслит
<?php
function translit($string) {
        
$eng = array(
        
'yo','iy','yu','\'','ch','sh','c','u','k','e','n','g','sh','z','h','\'','f','y','v','a','p','r','o','l','d','j','е','ya','s','m','i','t','b');      
 
        
$rus = array(
        
'ё','й','ю','ь','ч','щ','ц','у','к','е','н','г','ш','з','х','ъ','ф','ы','в','а','п','р','о','л','д','ж','е','я','с','м','и','т','б');
       if(!empty(
$string))
            return 
str_ireplace($eng$rus$string);
}

$text "Nachalo <a href=#link>url</a><br/><br/><table border=1><tr><td><p>Tekst123</p></td><td>test1</td>";
$text.= "<td><span><b>Tekst456</b></span></td><td>test2</td>";
$text.= "<td><p><strong>Tekst789</strong></p></td><td>test3</td><tr></table><br/>Konec";

echo 
preg_replace_callback(
        
// Начало строки до первого тэга если есть
        
'|^([^<]*)|',
        
create_function(
            
'$matches',
            
'return translit($matches[1]);'
        
),
        
        
// Внутри тэгов и между ними
        
preg_replace_callback(
        
'|<([^>]+)>([^<]*)<([^>]+)>([^<]*)|',
        
create_function(
            
'$matches',
            
'return "<". $matches[1] . ">". translit($matches[2]) . "<" . $matches[3] . ">" . translit($matches[4]);'
        
),
        
        
// Текст после последнего тэга если есть
        
preg_replace_callback(
        
'|([^>]*)$|',
        
create_function(
            
'$matches',
            
'return translit($matches[1]);'
        
),
        
$text
    
)
    )
    );

В принципе даже любая вложенность тэгов допустима.
Функцию транслит сами корректируйте как правильно, думаю, там всё ясно.

  Ответить  
 
 автор: coloboc66   (17.06.2013 в 10:55)   письмо автору
 
   для: DangerBay   (14.06.2013 в 22:25)
 

Спасибо! Кажется, всё работает.

  Ответить  
 
 автор: coloboc66   (19.06.2013 в 13:08)   письмо автору
 
   для: DangerBay   (14.06.2013 в 22:25)
 

Скрипт работает хорошо. Но вот столкнулся с ситуацией, что иногда в строке есть латинские символы, которые нужно оставить без изменения. Как тут быть? Пробовал их помечать в исходном коде (что-то типа ^m), но это не помогает. :(

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

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