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

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

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

 

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

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

тема: Замена целых слов
 
 автор: Shorr Kan   (02.12.2006 в 10:46)   письмо автору
 
 

Мне нужно заменить в тексте русские слова на английские эквиваленты. Но возникает проблема перевода неполных слов. То есть:


=== словарик ===
ля:la
ляяяяя:laaaaa
==============

=== текст для перевода ===
ля
ляяяяя
=======================

если использовать str_replace - порой получается так:

=== переведенный текст ===
la
laяяяя
=======================

То есть, str_replace'у не интересно, что это - только часть слова. Он просто меняет, и все.

Как этого избежать при помощи регулярных выражений? Ну сделать замену полных слов и избегать замены части слова?
Теоретически, слова разделены \n, но на практике - я не уверен.

   
 
 автор: cheops   (02.12.2006 в 13:19)   письмо автору
 
   для: Shorr Kan   (02.12.2006 в 10:46)
 

В этом случае обычно прибегают к регулярному выражению вида
<?php
  $text 
preg_replace("|\bля\b|is","la"$text);
?>

Символ \b - обозначает границу слова.

   
 
 автор: Shorr Kan   (03.12.2006 в 13:14)   письмо автору
 
   для: cheops   (02.12.2006 в 13:19)
 

Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement in an array.

воть... да, я забыл сказать, что заменяемое и то, на что заменяем - массивы. Но, вроде, в справочнике написано, что preg_replace принимает массивы...

$text - строка.

   
 
 автор: cheops   (03.12.2006 в 13:18)   письмо автору
 
   для: Shorr Kan   (03.12.2006 в 13:14)
 

Вы массивы подставляете, не могли бы вы прикрепить к сообщению код, который вызывает предупреждение? Вообще говоря, да, можно использовать массивы.

   
 
 автор: Shorr Kan   (03.12.2006 в 13:21)   письмо автору
 
   для: cheops   (03.12.2006 в 13:18)
 

<?
foreach($trans as $inkey){
          
$word=explode(':',trim($inkey));
          
$a1[]=trim($word[0]);
      
$a2[]=trim($word[1]);
   }
//foreach $trans 


foreach (glob($dir.'file/*.txt') as $file) {
   
$new=strrchr($file,'/');
   
$fp=fopen($dir.'new'.$new,'w+');
   
fwrite($fp,preg_replace("|\b".$a1."\b|is",$a2,file_get_contents($file))); // тут он обижается
   
fclose($fp);
   @
chmod($dir.'new'.$new,0777); 
}
//foreach glob
?>

   
 
 автор: cheops   (03.12.2006 в 14:24)   письмо автору
 
   для: Shorr Kan   (03.12.2006 в 13:21)
 

Так не пойдёт, a1 - это массив, когда вы его встраиваете в строку - получается строка, следует поступить примерно так
<? 
foreach($trans as $inkey){ 
          
$word=explode(':',trim($inkey)); 
          
$a1[]="|\b".trim($word[0])."\b|is"
      
$a2[]=trim($word[1]); 
   }
//foreach $trans  


foreach (glob($dir.'file/*.txt') as $file) { 
   
$new=strrchr($file,'/'); 
   
$fp=fopen($dir.'new'.$new,'w+'); 
   
fwrite($fp,preg_replace($a1,$a2,file_get_contents($file))); // тут он обижается 
   
fclose($fp); 
   @
chmod($dir.'new'.$new,0777);  
}
//foreach glob 
?>

   
 
 автор: Shorr Kan   (03.12.2006 в 16:26)   письмо автору
 
   для: cheops   (03.12.2006 в 14:24)
 

Да, ошибку не выдает... но и слова не переводит.
Смотрите, словарик:



форум:forum
фото:photo


Это только пример...
файл для перевода...


форум ipb
пейзажные фото


а скрипт ничего не переводит...


<?
$dir
='/home/user/domains/domain.com/public_html/';

set_time_limit(0);

$trans=explode("\n",mb_strtolower(file_get_contents($dir.'slov.txt')));
foreach(
$trans as $inkey){
      
$word=explode(':',trim($inkey));
      
$a1[]="|\b".trim($word[0])."\b|is";
      
$a2[]=trim($word[1]);
    }
//foreach $val

foreach (glob($dir.'file/*.txt') as $file) {
   
$new=strrchr($file,'/');
   
   print 
$dir.'new'.$new.'<Br>';
   
$fp=fopen($dir.'new'.$new,'w+');
   
#fwrite($fp,str_replace($a1,$a2,file_get_contents($file)));
   
fwrite($fp,preg_replace($a1,$a2,file_get_contents($file)));
   
fclose($fp);
   @
chmod($dir.'new'.$new,0777);
}
//foreach
?> 

   
 
 автор: EXP   (04.12.2006 в 06:47)   письмо автору
 
   для: Shorr Kan   (03.12.2006 в 16:26)
 

А неполучится так, если слова брать с пробелами?
<?

$st 
file_get_contents('text.txt');
$ar = array(' forum '' foto '' car ');
$ar2 = array(' форум '' фото '' машина '); // ;)
$st str_replace($ar$ar2$st); 
echo 
$st ;
//невнимательно читал, похоже дело гдето в этом
$a1[] .= '"|\b+('.trim($word[0]).')+\b|is"';
//может так?

   
 
 автор: EXP   (04.12.2006 в 16:10)   письмо автору
 
   для: EXP   (04.12.2006 в 06:47)
 

Заработало только если так:
<?   
   $a1
[] = "|\b".trim($word[0])."\b|is";     
$a2[] = trim($word[1]);
//и так 
$a1[] = '|\b('.trim($word[0]).')\b|is';
$a2[] = trim($word[1]);

   
Rambler's Top100
вверх

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