|
|
|
| Мне нужно заменить в тексте русские слова на английские эквиваленты. Но возникает проблема перевода неполных слов. То есть:
=== словарик ===
ля:la
ляяяяя:laaaaa
==============
=== текст для перевода ===
ля
ляяяяя
=======================
если использовать str_replace - порой получается так:
=== переведенный текст ===
la
laяяяя
=======================
То есть, str_replace'у не интересно, что это - только часть слова. Он просто меняет, и все.
Как этого избежать при помощи регулярных выражений? Ну сделать замену полных слов и избегать замены части слова?
Теоретически, слова разделены \n, но на практике - я не уверен. | |
|
|
|
|
|
|
|
для: Shorr Kan
(02.12.2006 в 10:46)
| | В этом случае обычно прибегают к регулярному выражению вида
<?php
$text = preg_replace("|\bля\b|is","la", $text);
?>
|
Символ \b - обозначает границу слова. | |
|
|
|
|
|
|
|
для: cheops
(02.12.2006 в 13:19)
| | Warning: preg_replace(): Parameter mismatch, pattern is a string while replacement in an array.
воть... да, я забыл сказать, что заменяемое и то, на что заменяем - массивы. Но, вроде, в справочнике написано, что preg_replace принимает массивы...
$text - строка. | |
|
|
|
|
|
|
|
для: Shorr Kan
(03.12.2006 в 13:14)
| | Вы массивы подставляете, не могли бы вы прикрепить к сообщению код, который вызывает предупреждение? Вообще говоря, да, можно использовать массивы. | |
|
|
|
|
|
|
|
для: 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
?>
|
| |
|
|
|
|
|
|
|
для: 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
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(03.12.2006 в 14:24)
| | Да, ошибку не выдает... но и слова не переводит.
Смотрите, словарик:
Это только пример...
файл для перевода...
а скрипт ничего не переводит...
<?
$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
?>
|
| |
|
|
|
|
|
|
|
для: 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 в 06:47)
| | Заработало только если так:
<?
$a1[] = "|\b".trim($word[0])."\b|is";
$a2[] = trim($word[1]);
//и так
$a1[] = '|\b('.trim($word[0]).')\b|is';
$a2[] = trim($word[1]);
|
| |
|
|
|