Home PHP А.Волос "PHP Практика " Глава 5 Несколько скриптов Увеличительная линза
Увеличительная линза PDF Печать E-mail
Автор: А.Волос   

 linza

Программа, которая обыгрывает hack_24 из книги Д.Харрингтона "PHP HACKS". При запуске скрипта пользователю предоставляется форма для ввода текста. Текст методом copy/paste вводится в поле формы. Нажимается кнопка "Обработать". Результат: на странице полный набор использованных в исходной статье слов. Слова отсортированы по алфавиту. Каждое слово является ссылкой на на википедию, нажав на которую можно узнать значение этого слова. И главное - чем чаще слово используется в статье, тем более крупным шрифтом оно написано! Своеобразный эффект увеличительной линзы.

Сохраните код скрипта в файл linz.php. Загрузите файл на ваш веб-сервер и откройте в браузере эту страницу.


<?php
$text = $_POST['text'];

if (isset($text)) {

if($text == ""){
echo "<h3>Не все поля заполнены</h3>";
}
else{
// здесь код обработки строки
process_form($text);

}
}
else{
form();
}
?>

<?php
function form() {
?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Simple </title>
</head>
<body>

<form action="linz.php" method="post">
<p>

<label for="text">Введите текст:</label>
<textarea rows="30" cols="80" name="text" id="text"></textarea>
</p>
<p>
<input type="submit" value="Обработать" />
</p>
</form>

</body>
</html>

<?php } ?>

<?php
function process_form($text) {

$wordcounts = array();

$bad_words = " a about an and are as at be been bin but by could did for from
had he her him his in into none nor not of on she such that the their them then there they this those to too
until up was were what when where which while with who whose why would ";

$words = split( " ","$text" );
foreach( $words as $word )
{
$word1 = strtolower( $word );
$word2 = trim("$word1"); //удалим пробелы
$word3 = rtrim("$word2",',.?"'); //удалим знаки препинания
$word = ltrim($word3,'\"'); //удалим кавычки
if ( strlen( $word ) > 0 )
{
if ( ! array_key_exists( $word, $wordcounts ) ){ //если такого ключа нет, установим начальное значение
$wordcounts[ $word ] = 0;
}
if (strpos($bad_words, $word) ){ //если слово есть в "плохом списке", установим значение ноль
$wordcounts[ $word ] = 0;
}
$wordcounts[ $word ] += 1;
}
}

$min = 1000000;
$max = -1000000;

foreach( array_keys( $wordcounts ) as $word ) {

if ( $wordcounts[ $word ] > $max )
$max = $wordcounts[ $word ];
if ( $wordcounts[ $word ] < $min )
$min = $wordcounts[ $word ];
}

$ratio = 18.0 / ( $max - $min );
?>

<html> <head>
<style type="text/css">
body { font-family: arial, verdana, sans-serif; }
.link { line-height: 20pt; }
</style>
</head>
<body>
<div style="width:600px;">

<?php
$wc = array_keys( $wordcounts );
sort( $wc );
foreach( $wc as $word )
{
$fs = (int)( 9 + ( $wordcounts[ $word ] * $ratio ) );
?>
<a class="link" href="http://en.wikipedia.org/wiki/<?php echo($word);?>" style="font-size:<?php echo( $fs ); ?>pt;">
<?php echo( $word ); ?></a> &nbsp;
<?php } //end foreach ?>
</div>
</body>
</html>
<?php } ?>



Вверх

Анализ

Посмотрим функцию process_form().

function process_form($text) {

Объявляется массив:

$wordcounts = array();

Далее объявляется и инициируется массив "плохих" слов, так как в этой программе они только путают и мешают правильному результату:

$bad_words = " a about an and are as at be been bin but by could did for from
had he her him his in into none nor not of on she such that the
their them then there they this those to too until up was were
what when where which while with who whose why would ";

Далее переданная строка $text превращается в массив строк (массив слов):

$words = split( " ","$text" );

Далее этот массив строк обрабатывается в цикле foreach так, что для каждого слова есть счетчик. Если слово встечается снова и снова, то счетчик постоянно инкременируется. Так, что ассоциативный массив $wordcounts, содержит слова в качестве ключей и частоту их использования в качестве значений.

foreach( $words as $word )
{
$word1 = strtolower( $word );
$word2 = trim("$word1"); //удалим пробелы
$word3 = rtrim("$word2",',.?"'); //удалим знаки препинания
$word = ltrim($word3,'\"'); //удалим кавычки
if ( strlen( $word ) > 0 )
{
if ( ! array_key_exists( $word, $wordcounts ) ){ //если такого ключа нет, установим начальное значение
$wordcounts[ $word ] = 0;
}
if (strpos($bad_words, $word) ){ //если слово есть в "плохом списке", установим значение ноль
$wordcounts[ $word ] = 0;
}
$wordcounts[ $word ] += 1;
}
}

Кроме того в этом коде в цикле каждое слово проверяется на принадлежность его к массиву "плохих" слов (наподобие the,and,of,that и тд). Если слово принадлежит к этому массиву, то его рейтинг обнуляется. Массив "плохих" слов естественно вы можете редактировать по своему усмотрению.

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

$min = 1000000; $max = -1000000;

foreach( array_keys( $wordcounts ) as $word )
{

if ( $wordcounts[ $word ] > $max )
$max = $wordcounts[ $word ];
if ( $wordcounts[ $word ] < $min )
$min = $wordcounts[ $word ];
}
$ratio = 18.0 / ( $max - $min );

Симпатичная программа!

 

Правильный CSS!

Обновлено 24.09.2014 04:26