2012-06-13 1 views
1

Хорошо, я пишу комментарии к файлу UTF-8, который я читаю внутри функции ниже, чтобы удалить текст между этими комментариями. Мой вопрос: мне нужно что-то другое, чтобы сделать это успешно для файлов UTF-8? Или будет работать следующий код ниже? В принципе, мне интересно, нужны ли мне функции utf8_decode и/или utf8_encode, или, возможно, iconv?PHP - Нужна ли мне кодировка/декодирование UTF-8?

// This holds the current file we are working on. 
$lang_file = 'files/DreamTemplates.russian-utf8.php'; 

// Can't read from the file if it doesn't exist now can we? 
if (!file_exists($lang_file)) 
    continue; 

// This helps to remove the language strings for the template, since the comment is unique 
$template_begin_comment = '// ' . ' Template - ' . $lang_file . ' BEGIN...'; 
$template_end_comment = '// ' . ' Template - ' . $lang_file . ' END!'; 

$fp = fopen($lang_file, 'rb'); 
$content = fread($fp, filesize($lang_file)); 
fclose($fp); 

// Searching within the string, extracting only what we need. 
$start = strpos($content, $template_begin_comment); 
$end = strpos($content, $template_end_comment); 

// We can't do this unless both are found. 
if ($start !== false && $end !== false) 
{ 
    $begin = substr($content, 0, $start); 
    $finish = substr($content, $end + strlen($template_end_comment)); 

    $new_content = $begin . $finish; 

    // Write it into the file. 
    $fo = fopen($lang_file, 'wb'); 
    @fwrite($fo, $new_content); 
    fclose($fo); 
} 

Спасибо за вашу помощь в этом относительно UTF-8 кодирования и декодирования на строках, даже если они прокомментированы строки.

Когда я пишу php-комментарии в файл UTF-8, я не использую никакого преобразования. Должна ли я быть?? Определения строк между комментариями php уже закодированы в UTF-8 и, похоже, работают нормально в файле. Любая помощь ценится здесь.

+0

Когда вы запускаете код, возникают ли у вас какие-либо проблемы с ним? Нарушаются ли русские символы где-нибудь, где используется этот файл? Можете ли вы открыть файлы, написанные PHP, в текстовом редакторе, и появятся ли символы, как ожидалось? – curtisdf

+0

Я не могу проверить это, потому что мне не хватает файла UTF-8, чтобы проверить это на данный момент в моих точных настройках тестовой среды для фактического содержимого файла. Мне просто интересно, работает ли этот подход без использования какой-либо кодировки и/или декодирования utf8 только для комментариев php? Причина: я пишу php-комментарии в файл раньше, и вышеуказанная функция должна удалить все это. Просто нужно, чтобы кто-то подтвердил, что это лучший способ сделать это только для файлов UTF-8, или если это нужно сделать по-другому? –

+0

Это, вероятно, даст вам более глубокое понимание: [Что каждый программист абсолютно, положительно должен знать о кодировках и наборах символов для работы с текстом) (http://kunststube.net/encoding/) – deceze

ответ

1

Нет, вам не нужно делать никаких конверсий.

Кроме того, ваш код извлечения будет надежным в том смысле, что он не будет манипулировать многобайтовыми символами, хотя вы можете захотеть убедиться, что конечная позиция возникает после начала pos.

+0

Хорошо, спасибо, что ответили на этот вопрос bro, и за то, что сообщили мне, что это будет также надежная точка извлечения. Приветствия :) –

1

Для этого я хотел бы использовать вместо preg_replace:

$content = file_get_contents($lang_file); 

$template_begin_comment = '// ' . ' Template - ' . $lang_file . ' BEGIN...'; 
$template_end_comment = '// ' . ' Template - ' . $lang_file . ' END!'; 

// find from begin comment to end comment 
// replace with emptiness 
// keep track of how many replacements have been made 
$new_content = preg_replace('/' . 
     preg_quote($template_begin_comment, '/') . 
     '.*?' . 
     preg_quote($template_end_comment, '/') . '/s', 
    '', 
    $content, 
    -1, 
    $replace_count 
); 

if ($replace_count) { 
    // if replacements have been made, write the file back again 
    file_put_contents($lang_file, $new_content); 
} 

Поскольку ваше соответствие содержит только ASCII, этот подход достаточно безопасен, потому что остальные копируются.

Отказ

Приведенный выше код не проверяется, если нет ничего плохого, просто дайте мне знать.

+0

Здравствуйте, я вижу ваш подход, но можете ли вы сказать мне, что не так с моим подходом, если что? Кроме того, мне также нужно будет избавиться от комментариев, делает ли этот подход это? Кроме того, записываемый файл содержит много комментариев PHP, и я не хочу удалять ничего, кроме того, что находится между $ template_begin_comment и $ template_end_comment. Это, и только это нужно удалить. Остальная часть текста там не должна быть затронута. –

+0

@SolomonClosson Я не видел ничего плохого в вашем подходе, это просто использование большего количества операций с кодом :). Строковые операции двоично безопасны в PHP ... это не слишком говорит, что он будет знать об Unicode. –

+0

Кроме того, мне также нужно будет избавиться от комментариев, делает ли этот подход это? Кроме того, записываемый файл содержит много комментариев PHP, и я не хочу удалять ничего, кроме того, что находится между $ template_begin_comment и $ template_end_comment. Это, и только это нужно удалить. Остальная часть текста там не должна быть затронута. –