(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP
str_word_count —
Возвращает информацию о словах, входящих в строку
Описание
str_word_count(string $string
, int $format
= 0, ?string $characters
= null
): array|int
Для этой функции «слово» обозначает строку с алфавитными
символами, зависящую от локали, которая также может содержать
символы «‘» и «-«, но не может начинаться с
них.
Обратите внимание, что многобайтовые языковые стандарты не поддерживаются.
Список параметров
-
string
-
Строка
-
format
-
Указывает возвращаемое значение данной функции. На данный момент
поддерживаются следующие значения:-
0 — возвращает количество найденных слов
-
1 — возвращается массив, содержащий все слова, входящие в строку
string
-
2 — возвращается массив, индексами которого являются позиции в
строкеstring
, а значениями — соответствующие слова.
-
-
characters
-
Список дополнительных символов, которые будут рассматриваться как «слово»
Возвращаемые значения
Возвращает массив или целое число, в зависимости от указанного
параметра format
.
Список изменений
Версия | Описание |
---|---|
8.0.0 |
characters теперь допускает значение null.
|
Примеры
Пример #1 Пример использования str_word_count()
<?php
$str
= "Hello fri3nd, you're
looking good today!";print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));
echo
str_word_count($str);?>
Результат выполнения данного примера:
Array ( [0] => Hello [1] => fri [2] => nd [3] => you're [4] => looking [5] => good [6] => today ) Array ( [0] => Hello [6] => fri [10] => nd [14] => you're [29] => looking [46] => good [51] => today ) Array ( [0] => Hello [1] => fri3nd [2] => you're [3] => looking [4] => good [5] => today ) 7
Смотрите также
- explode() — Разбивает строку с помощью разделителя
- preg_split() — Разбивает строку по регулярному выражению
- count_chars() — Возвращает информацию о символах, входящих в строку
- substr_count() — Возвращает число вхождений подстроки
cito at wikatu dot com ¶
11 years ago
<?php/***
* This simple utf-8 word count function (it only counts)
* is a bit faster then the one with preg_match_all
* about 10x slower then the built-in str_word_count
*
* If you need the hyphen or other code points as word-characters
* just put them into the [brackets] like [^p{L}p{N}'-]
* If the pattern contains utf-8, utf8_encode() the pattern,
* as it is expected to be valid utf-8 (using the u modifier).
**/
// Jonny 5's simple word splitter
function str_word_count_utf8($str) {
return count(preg_split('~[^p{L}p{N}']+~u',$str));
}
?>
splogamurugan at gmail dot com ¶
14 years ago
We can also specify a range of values for charlist.
<?php
$str = "Hello fri3nd, you're
looking good today!
look1234ing";
print_r(str_word_count($str, 1, '0..3'));
?>
will give the result as
Array ( [0] => Hello [1] => fri3nd [2] => you're [3] => looking [4] => good [5] => today [6] => look123 [7] => ing )
Adeel Khan ¶
15 years ago
<?php/**
* Returns the number of words in a string.
* As far as I have tested, it is very accurate.
* The string can have HTML in it,
* but you should do something like this first:
*
* $search = array(
* '@<script[^>]*?>.*?</script>@si',
* '@<style[^>]*?>.*?</style>@siU',
* '@<![sS]*?--[ tnr]*>@'
* );
* $html = preg_replace($search, '', $html);
*
*/function word_count($html) {# strip all html tags
$wc = strip_tags($html);# remove 'words' that don't consist of alphanumerical characters or punctuation
$pattern = "#[^(w|d|'|"|.|!|?|;|,|\|/|-|:|&|@)]+#";
$wc = trim(preg_replace($pattern, " ", $wc));# remove one-letter 'words' that consist only of punctuation
$wc = trim(preg_replace("#s*[('|"|.|!|?|;|,|\|/|-|:|&|@)]s*#", " ", $wc));# remove superfluous whitespace
$wc = preg_replace("/ss+/", " ", $wc);# split string into an array of words
$wc = explode(" ", $wc);# remove empty elements
$wc = array_filter($wc);# return the number of words
return count($wc);
}
?>
uri at speedy dot net ¶
10 years ago
Here is a count words function which supports UTF-8 and Hebrew. I tried other functions but they don't work. Notice that in Hebrew, '"' and ''' can be used in words, so they are not separators. This function is not perfect, I would prefer a function we are using in JavaScript which considers all characters except [a-zA-Zא-ת0-9_'"] as separators, but I don't know how to do it in PHP.
I removed some of the separators which don't work well with Hebrew ("x20", "xA0", "x0A", "x0D", "x09", "x0B", "x2E"). I also removed the underline.
This is a fix to my previous post on this page - I found out that my function returned an incorrect result for an empty string. I corrected it and I'm also attaching another function - my_strlen.
<?php function count_words($string) {
// Return the number of words in a string.
$string= str_replace("'", "'", $string);
$t= array(' ', "t", '=', '+', '-', '*', '/', '\', ',', '.', ';', ':', '[', ']', '{', '}', '(', ')', '<', '>', '&', '%', '$', '@', '#', '^', '!', '?', '~'); // separators
$string= str_replace($t, " ", $string);
$string= trim(preg_replace("/s+/", " ", $string));
$num= 0;
if (my_strlen($string)>0) {
$word_array= explode(" ", $string);
$num= count($word_array);
}
return $num;
}
function
my_strlen($s) {
// Return mb_strlen with encoding UTF-8.
return mb_strlen($s, "UTF-8");
}?>
charliefrancis at gmail dot com ¶
13 years ago
Hi this is the first time I have posted on the php manual, I hope some of you will like this little function I wrote.
It returns a string with a certain character limit, but still retaining whole words.
It breaks out of the foreach loop once it has found a string short enough to display, and the character list can be edited.
<?php
function word_limiter( $text, $limit = 30, $chars = '0123456789' ) {
if( strlen( $text ) > $limit ) {
$words = str_word_count( $text, 2, $chars );
$words = array_reverse( $words, TRUE );
foreach( $words as $length => $word ) {
if( $length + strlen( $word ) >= $limit ) {
array_shift( $words );
} else {
break;
}
}
$words = array_reverse( $words );
$text = implode( " ", $words ) . '…';
}
return $text;
}$str = "Hello this is a list of words that is too long";
echo '1: ' . word_limiter( $str );
$str = "Hello this is a list of words";
echo '2: ' . word_limiter( $str );
?>
1: Hello this is a list of words…
2: Hello this is a list of words
amosbatto at yahoo dot com ¶
2 years ago
//To get an accurate word count in English, some diacritical marks have
// to be added for words like née, Chloë, naïve, coöpt, façade, piñata, etc.
$count = str_word_count($str, 0, 'éëïöçñÉËÏÖÇÑ');
//To get the word count for any European language using a Roman alphabet:
$count = str_word_count($str, 0, 'äëïöüÄËÏÖÜáǽćéíĺńóŕśúźÁǼĆÉÍĹŃÓŔŚÚŹ'.
'àèìòùÀÈÌÒÙãẽĩõñũÃẼĨÕÑŨâêîôûÂÊÎÔÛăĕğĭŏœ̆ŭĂĔĞĬŎŒ̆Ŭ'.
'āēīōūĀĒĪŌŪőűŐŰąęįųĄĘĮŲåůÅŮæÆøØýÝÿŸþÞẞßđĐıIœŒ'.
'čďěľňřšťžČĎĚĽŇŘŠŤŽƒƑðÐłŁçģķļșțÇĢĶĻȘȚħĦċėġżĊĖĠŻʒƷǯǮŋŊŧŦ');
manrash at gmail dot com ¶
14 years ago
For spanish speakers a valid character map may be:
<?php
$characterMap = 'áéíóúüñ';
$count = str_word_count($text, 0, $characterMap);
?>
MadCoder ¶
17 years ago
Here's a function that will trim a $string down to a certian number of words, and add a... on the end of it.
(explansion of muz1's 1st 100 words code)
----------------------------------------------
<?php
function trim_text($text, $count){
$text = str_replace(" ", " ", $text);
$string = explode(" ", $text);
for ( $wordCounter = 0; $wordCounter <= $count;wordCounter++ ){
$trimed .= $string[$wordCounter];
if ( $wordCounter < $count ){ $trimed .= " "; }
else { $trimed .= "..."; }
}
$trimed = trim($trimed);
return $trimed;
}
?>
Usage
------------------------------------------------
<?php
$string = "one two three four";
echo trim_text($string, 3);
?>
returns:
one two three...
Anonymous ¶
18 years ago
This function seems to view numbers as whitespace. I.e. a word consisting of numbers only won't be counted.
brettNOSPAM at olwm dot NO_SPAM dot com ¶
20 years ago
This example may not be pretty, but It proves accurate:
<?php
//count words
$words_to_count = strip_tags($body);
$pattern = "/[^(w|d|'|"|.|!|?|;|,|\|/|--|:|&|@)]+/";
$words_to_count = preg_replace ($pattern, " ", $words_to_count);
$words_to_count = trim($words_to_count);
$total_words = count(explode(" ",$words_to_count));
?>
Hope I didn't miss any punctuation. ;-)
brettz9 — see yahoo ¶
13 years ago
Words also cannot end in a hyphen unless allowed by the charlist...
php dot net at salagir dot com ¶
5 years ago
This function doesn't handle accents, even in a locale with accent.
<?php
echo str_word_count("Is working"); // =2setlocale(LC_ALL, 'fr_FR.utf8');
echo str_word_count("Not wôrking"); // expects 2, got 3.
?>
Cito solution treats punctuation as words and thus isn't a good workaround.
<?php
function str_word_count_utf8($str) {
return count(preg_split('~[^p{L}p{N}']+~u',$str));
}
echo str_word_count_utf8("Is wôrking"); //=2
echo str_word_count_utf8("Not wôrking."); //=3
?>
My solution:
<?php
function str_word_count_utf8($str) {
$a = preg_split('/W+/u', $str, -1, PREG_SPLIT_NO_EMPTY);
return count($a);
}
echo str_word_count_utf8("Is wôrking"); // = 2
echo str_word_count_utf8("Is wôrking! :)"); // = 2
?>
joshua dot blake at gmail dot com ¶
16 years ago
I needed a function which would extract the first hundred words out of a given input while retaining all markup such as line breaks, double spaces and the like. Most of the regexp based functions posted above were accurate in that they counted out a hundred words, but recombined the paragraph by imploding an array down to a string. This did away with any such hopes of line breaks, and thus I devised a crude but very accurate function which does all that I ask it to:
<?php
function Truncate($input, $numWords)
{
if(str_word_count($input,0)>$numWords)
{
$WordKey = str_word_count($input,1);
$PosKey = str_word_count($input,2);
reset($PosKey);
foreach($WordKey as $key => &$value)
{
$value=key($PosKey);
next($PosKey);
}
return substr($input,0,$WordKey[$numWords]);
}
else {return $input;}
}
?>
The idea behind it? Go through the keys of the arrays returned by str_word_count and associate the number of each word with its character position in the phrase. Then use substr to return everything up until the nth character. I have tested this function on rather large entries and it seems to be efficient enough that it does not bog down at all.
Cheers!
Josh
jazz090 ¶
14 years ago
Personally, I dont like using this function becuase the characters it omits are sometime nessesery for instance MS Word counts ">" or "<" alone as single word where this function doesnt. I like using this however, it counts EVERYTHING:
<?php
function num_words($string){
preg_match_all("/S+/", $string, $matches);
return count($matches[0]);
}
?>
Samer Ata ¶
11 years ago
This is my own version of to get SEO meta description from wordpress post content. it is also generic usage function to get the first n words from a string.
<?php
function my_meta_description($text,$n=10)
{
$text=strip_tags($text); // not neccssary for none HTML
// $text=strip_shortcodes($text); // uncomment only inside wordpress system
$text = trim(preg_replace("/s+/"," ",$text));
$word_array = explode(" ", $text);
if (count($word_array) <= $n)
return implode(" ",$word_array);
else
{
$text='';
foreach ($word_array as $length=>$word)
{
$text.=$word ;
if($length==$n) break;
else $text.=" ";
}
}
return $text;
?>
josh at joshblake.net ¶
16 years ago
I was interested in a function which returned the first few words out of a larger string.
In reality, I wanted a preview of the first hundred words of a blog entry which was well over that.
I found all of the other functions which explode and implode strings to arrays lost key markups such as line breaks etc.
So, this is what I came up with:
<?php
function WordTruncate($input, $numWords) {
if(str_word_count($input,0)>$numWords)
{
$WordKey = str_word_count($input,1);
$WordIndex = array_flip(str_word_count($input,2));
return substr($input,0,$WordIndex[$WordKey[$numWords]]);
}
else {return $input;}
}
?>
While I haven't counted per se, it's accurate enough for my needs. It will also return the entire string if it's less than the specified number of words.
The idea behind it? Use str_word_count to identify the nth word, then use str_word_count to identify the position of that word within the string, then use substr to extract up to that position.
Josh.
dmVuY2lAc3RyYWhvdG5pLmNvbQ== (base64) ¶
12 years ago
to count words after converting a msword document to plain text with antiword, you can use this function:
<?php
function count_words($text) {
$text = str_replace(str_split('|'), '', $text); // remove these chars (you can specify more)
$text = trim(preg_replace('/s+/', ' ', $text)); // remove extra spaces
$text = preg_replace('/-{2,}/', '', $text); // remove 2 or more dashes in a row
$len = strlen($text);
if (
0 === $len) {
return 0;
}$words = 1;
while (
$len--) {
if (' ' === $text[$len]) {
++$words;
}
}
return
$words;
}
?>
it strips the pipe "|" chars, which antiword uses to format tables in its plain text output, removes more than one dashes in a row (also used in tables), then counts the words.
counting words using explode() and then count() is not a good idea for huge texts, because it uses much memory to store the text once more as an array. this is why i'm using while() { .. } to walk the string
philip at cornado dot com ¶
20 years ago
Some ask not just split on ' ', well, it's because simply exploding on a ' ' isn't fully accurate. Words can be separated by tabs, newlines, double spaces, etc. This is why people tend to seperate on all whitespace with regular expressions.
rcATinterfacesDOTfr ¶
20 years ago
Here is another way to count words :
$word_count = count(preg_split('/W+/', $text, -1, PREG_SPLIT_NO_EMPTY));
aix at lux dot ee ¶
18 years ago
One function.
<?php
if (!function_exists('word_count')) {
function word_count($str,$n = "0"){
$m=strlen($str)/2;
$a=1;
while ($a<$m) {
$str=str_replace(" "," ",$str);
$a++;
}
$b = explode(" ", $str);
$i = 0;
foreach ($b as $v) {
$i++;
}
if ($n==1) return $b;
else return $i;
}
}
$str="Tere Tartu linn";
$c = word_count($str,1); // it return an array
$d = word_count($str); // it return int - how many words was in text
print_r($c);
echo $d;
?>
Anonymous ¶
16 years ago
Here is a php work counting function together with a javascript version which will print the same result.
<?php
//Php word counting function
function word_count($theString)
{
$char_count = strlen($theString);
$fullStr = $theString." ";
$initial_whitespace_rExp = "^[[:alnum:]]$";$left_trimmedStr = ereg_replace($initial_whitespace_rExp,"",$fullStr);
$non_alphanumerics_rExp = "^[[:alnum:]]$";
$cleanedStr = ereg_replace($non_alphanumerics_rExp," ",$left_trimmedStr);
$splitString = explode(" ",$cleanedStr);$word_count = count($splitString)-1;
if(
strlen($fullStr)<2)
{
$word_count=0;
}
return $word_count;
}
?>
<?php
//Function to count words in a phrase
function wordCount(theString)
{
var char_count = theString.length;
var fullStr = theString + " ";
var initial_whitespace_rExp = /^[^A-Za-z0-9]+/gi;
var left_trimmedStr = fullStr.replace(initial_whitespace_rExp, "");
var non_alphanumerics_rExp = rExp = /[^A-Za-z0-9]+/gi;
var cleanedStr = left_trimmedStr.replace(non_alphanumerics_rExp, " ");
var splitString = cleanedStr.split(" ");
var
word_count = splitString.length -1;
if (
fullStr.length <2)
{
word_count = 0;
}
return word_count;
}
?>
Artimis ¶
19 years ago
Never use this function to count/separate alphanumeric words, it will just split them up words to words, numbers to numbers. You could refer to another function "preg_split" when splitting alphanumeric words. It works with Chinese characters as well.
matthewkastor at live dot com ¶
12 years ago
This needs improvement, but works well as is.
<?php
/**
* Generates an alphabetical index of unique words, and a count of their occurrences, in a file.
*
* This works on html pages or plain text files.
* This function uses file_get_contents, so it
* is possible to use a url instead of a local filename.
*
* Change the search pattern at
* <code> $junk = preg_match('/[^a-zA-Z]/', $word); </code>
* if you want to keep words with numbers or other characters. The pattern
* I've set searches for anything that is not an upper or lowercase letter,
* you may want something else.
*
* The array returned will look something like this:
* <code>
* Array
* (
* [0] => Array
* (
* [word] => a
* [count] => 21
* )
*
* [1] => Array
* (
* [word] => ability
* [count] => 1
* )
* )
* </code>
*
* @param string $file The file ( or url ) you want to create an index from.
* @return array
*/
function index_page($file) {
$index = array();
$find = array(
'/r/',
'/n/',
'/ss+/'
);
$replace = array(
' ',
' ',
' '
);
$work = file_get_contents($file);
$work = preg_replace('/[>][<]/', '> <', $work);
$work = strip_tags($work);
$work = strtolower($work);
$work = preg_replace($find, $replace, $work);
$work = trim($work);
$work = explode(' ', $work);
natcasesort($work);
$i = 0;
foreach($work as $word) {
$word = trim($word);
$junk = preg_match('/[^a-zA-Z]/', $word);
if($junk == 1) {
$word = '';
}
if( (!empty($word)) && ($word != '') ) {
if(!isset($index[$i]['word'])) { // if not set this is a new index
$index[$i]['word'] = $word;
$index[$i]['count'] = 1;
} elseif( $index[$i]['word'] == $word ) { // count repeats
$index[$i]['count'] += 1;
} else { // else this is a different word, increment $i and create an entry
$i++;
$index[$i]['word'] = $word;
$index[$i]['count'] = 1;
}
}
}
unset($work);
return($index);
}
?>
example usage:
<?php
$file = 'http://www.php.net/';
// or use a local file, see file_get_contents() for valid filenames and restrictions.$index = index_page($file);
echo '<pre>'.print_r($index,true).'</pre>';
?>
Kirils Solovjovs ¶
19 years ago
Nothing of this worked for me. I think countwords() is very encoding dependent. This is the code for win1257. For other layots you just need to redefine the ranges of letters...
<?php
function countwords($text){
$ls=0;//was it a whitespace?
$cc33=0;//counter
for($i=0;$i<strlen($text);$i++){
$spstat=false; //is it a number or a letter?
$ot=ord($text[$i]);
if( (($ot>=48) && ($ot<=57)) || (($ot>=97) && ($ot<=122)) || (($ot>=65) && ($ot<=90)) || ($ot==170) ||
(($ot>=192) && ($ot<=214)) || (($ot>=216) && ($ot<=246)) || (($ot>=248) && ($ot<=254)) )$spstat=true;
if(($ls==0)&&($spstat)){
$ls=1;
$cc33++;
}
if(!$spstat)$ls=0;
}
return $cc33;
}?>
andrea at 3site dot it ¶
19 years ago
if string doesn't contain the space " ", the explode method doesn't do anything, so i've wrote this and it seems works better ... i don't know about time and resource
<?php
function str_incounter($match,$string) {
$count_match = 0;
for($i=0;$i<strlen($string);$i++) {
if(strtolower(substr($string,$i,strlen($match)))==strtolower($match)) {
$count_match++;
}
}
return $count_match;
}
?>
example
<?php
$string = "something:something!!something";
$count_some = str_incounter("something",$string);
// will return 3
?>
lwright at psu dot edu ¶
16 years ago
If you are looking to count the frequency of words, try:
<?php
$wordfrequency
= array_count_values( str_word_count( $string, 1) );?>
broncha at rajesharma dot com ¶
7 years ago
Turns out the charlist is set by default for the web. For example, the string
Copyright © ABC Ltd.
is 3 words in the cli and 4 words if executing in web context.
eanimator at yahoo dot com ¶
14 years ago
My quick and rough wordLimiter function.
<?php
function WordLimiter($text,$limit=20){
$explode = explode(' ',$text);
$string = '';
$dots = '...';
if(count($explode) <= $limit){
$dots = '';
}
for($i=0;$i<$limit;$i++){
$string .= $explode[$i]." ";
}
return
$string.$dots;
}
?>
lballard dot cat at gmail dot com ¶
12 years ago
word limiter:
<?php
$str = "my hella long string" ;
$length = 3;
$shortened =
implode(' ',array_slice(str_word_count($str,1),0,$length));
?>
dev dot vegera at gmail dot com ¶
2 years ago
preg_match_all based function to mimic str_word_count behavior:
<?php
function mb_str_word_count($str, $format = 2, $charlist = '') {
if ($format < 0 || $format > 2) {
throw new InvalidArgumentException('Argument #2 ($format) must be a valid format value');
}
$count = preg_match_all('#[p{L}p{N}][p{L}p{N}'' . $charlist . ']*#u', $str, $matches, $format === 2 ? PREG_OFFSET_CAPTURE : PREG_PATTERN_ORDER);
if ($format === 0) {
return $count;
}
$matches = $matches[0] ?? [];
if ($format === 2) {
$result = [];
foreach ($matches as $match) {
$result[$match[1]] = $match[0];
}
return $result;
}
return $matches;
}
?>
aidan at php dot net ¶
18 years ago
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
http://pear.php.net/package/PHP_Compat
jak74 at interia dot pl ¶
6 years ago
// split the phrase by any number of commas or space characters,
// which include " ", r, t, n and f
$keywords = preg_split("/[s,]+/", "hypertext language, programming");
print_r($keywords);
Мы живем в мире, где PHP разработчикам приходится время от времени взаимодействовать с операционной системой Windows. WMI (Windows Management Interface, Интерфейс управления Windows) — один из таких примеров — взаимодействие с Microsoft Office.
В данной статье мы рассмотрим простую интеграцию между Word и PHP: генерацию документа Microsoft Word на основе полей ввода в HTML-форме с помощью PHP (и его расширения Interop).
Подготовительные шаги
Первым делом убедимся, что у нас настроено базовое окружение WAMP. Так как Interop присутствует только в Windows, то нам необходимо, чтобы наш сервер Apache и инсталляция PHP были развернуты на Windows машине. В этом качестве я использую EasyPHP 14.1, который крайне прост в установке и настройке.
Следующим делом необходимо установить Microsoft Office. Версия не очень важна. Я использую Microsoft Office 2013 Pro, но любая версия Office старше 2007 должна подойти.
Также необходимо убедиться, что у нас установлены библиотеки для разработки приложения Interop (PIA, Primary Interop Assemblies, Основные Сборки Interop). Узнать это можно открыв Проводник Windows, и перейдя в директорию <Windows Directory>assembly
, и там мы должны увидеть набор установленных сборок:
Здесь можно увидеть элемент Microsoft.Office.Interop.Word
(подчеркнут на скриншоте). Это будет та сборка, которую мы будем использовать в нашей демонстрации. Пожалуйста, обратите особое внимание на поля “Assembly name (Имя сборки)”, “Version (Версия)” и “Public key token (Токен публичного ключа)”. Их мы скоро будем использовать в нашем PHP скрипте.
В этой директории также присутствуют и другие сборки (включая и все семейство Office), доступные для использования в своих программах (не только для PHP, но также и для VB.net, C#, и т.д.).
Если список сборок не включает весь пакет Microsoft.Office.Interop
, то нам нужно либо переустановить Office, добавив PIA, или вручную загрузить пакет с сайта Microsoft и установить его. Для более детальных инструкций обратитесь к этой странице на MSDN.
Замечание: к загрузке и установке доступен только дистрибутив PIA Microsoft Office 2010. Версия сборок в этом пакете 14.0.0, а 15 версия поставляется только с Office 2013.
И, наконец, необходимо включить расширение php_com_dotnet.dll
в php.ini
и перезапустить сервер.
Теперь можно перейти к программированию.
HTML форма
Так как основная часть данного примера ложится на серверную сторону, мы создадим простую страничку с формой, которая будет выглядеть следующим образом:
У нас есть текстовое поле для имени, группа переключателей для пола, слайдер для возраста, и область ввода текста для ввода сообщения, а также небезызвестная кнопка “Отправить”.
Сохраните этот файл как “index.html” в директории виртуального хоста, чтобы до него можно было добраться по адресу типа http://test/test/interop
.
Серверная часть
Файл-обработчик на серверной стороне — это основная цель нашего разговора. Для начала я приведу полный код этого файла, а потом объясню его шаг за шагом.
<?php $inputs = $_POST; $inputs['printdate']=''; // Инициализация значения, чтобы избежать замечания от PHP о том, что в POST данных нет переменной “printdate” $assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; $class = 'Microsoft.Office.Interop.Word.ApplicationClass'; $w = new DOTNET($assembly, $class); $w->visible = true; $fn = __DIR__ . '\template.docx'; $d = $w->Documents->Open($fn); echo "Документ открыт.<br><hr>"; $flds = $d->Fields; $count = $flds->Count; echo "В документе $count полей.<br>"; echo "<ul>"; $mapping = setupfields(); foreach ($flds as $index => $f) { $f->Select(); $key = $mapping[$index]; $value = $inputs[$key]; if ($key == 'gender') { if ($value == 'm') $value = 'Mr.'; else $value = 'Ms.'; } if($key=='printdate') $value= date ('Y-m-d H:i:s'); $w->Selection->TypeText($value); echo "<li>Назначаю полю $index: $key значение $value</li>"; } echo "</ul>"; echo "Обработка завершена!<br><hr>"; echo "Печатаю, пожалуйста, подождите...<br>"; $d->PrintOut(); sleep(3); echo "Готово!"; $w->Quit(false); $w=null; function setupfields() { $mapping = array(); $mapping[0] = 'gender'; $mapping[1] = 'name'; $mapping[2] = 'age'; $mapping[3] = 'msg'; $mapping[4] = 'printdate'; return $mapping; }
После того, как мы записали в переменную $inputs
значения, полученные из формы, а также создали пустой элемент с ключом printdate
(зачем мы это сделали — обсудим позже), мы переходим к четырем очень важным строкам:
$assembly = 'Microsoft.Office.Interop.Word, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'; $class = 'Microsoft.Office.Interop.Word.ApplicationClass'; $w = new DOTNET($assembly, $class); $w->visible = true;
Манипулятор COM в PHP требует создания экземпляра класса в рамках “сборки”. В нашем случае мы работаем с Word. Если взглянуть на первый скриншот, то можно записать полную сигнатуру сборки для Word:
- “Name”, “Version”, “Public Key Token” — все это берется из информации, которую можно просмотреть в
“c:Windowsassembly“
. - “Culture” всегда
neutrual
Класс, на который мы хотим ссылаться, всегда называется “имя.сборки”+ “.ApplicationClass
“.
Установив два этих параметра мы сможем получить объект для работы с Word.
Этот объект может оставаться в фоне, или мы можем перевести его в рабочий режим установкой атрибута visible
в true
.
Следующим шагом открываем документ, требующий обработки, и записываем экземпляр “документа” в переменную $d
.
Чтобы создать в документе содержимое, основанное на данных с формы, можно пойти несколькими путями.
Самым неправильным было бы жестко прописать содержимое документа в PHP, а потом вывести его в документ Word. Я настоятельно рекомендую этого не делать по следующим причинам:
- Вы теряете гибкость. Любые изменения в выходном файле потребуют изменения кода PHP.
- Это нарушает разделение управления и вида
- Применение стилей к содержимому документа (выравнивание, шрифты, стили, и т.д.) в скрипте сильно увеличит количество строк кода. Программное изменение стилей чересчур громоздко.
Другим вариантом будет использование поиска и замены. У PHP есть хорошие встроенные средства для этого. Мы можем создать документ Word, в котором разместим метки со специальными разделителями, которые в последствии будут заменены. Например, мы можем создать документ, который будет содержать следующий фрагмент:
а с помощью PHP мы легко можем заменить его на содержимое поля “Имя”, полученное с формы.
Это просто, и избавляет нас ото всех неприятных последствий, с которыми мы сталкиваемся в первом способе. Нам всего лишь нужно определиться с правильным разделителем, и в этом случае мы, получается, используем шаблон.
Я рекомендую третий способ, и он основывается на более глубоком знании Word. В качестве заполнителей мы будем использовать поля, а с помощью PHP кода будем непосредственно обновлять значения в полях соответствующими значениями.
Этот подход гибкий, быстрый, и согласуется с лучшими практиками работы с Word. С его помощью также можно избежать полнотекстового поиска в документе, что хорошо сказывается на производительности. Замечу, что у этого решения также есть недостатки.
Word с самого начала не поддерживал именные индексы для полей. Даже если мы и указали имена для создаваемых полей — нам все равно необходимо пользоваться числовыми идентификаторами этих полей. Это также объясняет, зачем нам нужно использовать отдельную функцию (setupfields
) для того, чтобы задать соответствие индекса поля и имени поля из формы.
В этом демонстрационном уроке мы будем использовать документ с 5 полями MERGEFIELD
. Шаблонный документ разместим там же, где и наш скрипт-обработчик.
Прошу заметить, что поле printdate
не имеет соответствующего поля на форме. Вот зачем мы добавили пустой элемент printdate
в массив $inputs
. Без этого скрипт все же будет запускаться и работать, но PHP будет выдавать предупреждение, что индекс printdate
отсутствует в массиве $inputs
.
После замены полей новыми значениями мы отпечатаем документ с помощью
Метод PrintOut
принимает несколько необязательных параметров, и мы используем самую простую его форму. Так будет отпечатана одна копия документа на принтере по умолчанию, который присоединен к Windows-машине.
Также можно вызвать PrintPreview
, чтобы взглянуть на получившийся результат, прежде чем его отпечатать. В полностью автоматическом окружении мы, конечно же, будем использовать метод PrintOut
.
Необходимо подождать некоторое время, прежде чем завершить работу с приложением Word, так нужно время на то чтобы поставить в очередь задание на печать. Без delay(3)
метод $w->Quit
выполняется незамедлительно, и задание не ставится в очередь.
Наконец, мы вызываем $w->Quit(false)
, что закрывает приложение Word, которое было вызвано нашим скриптом. Единственным параметром, передаваемым в метод, является указание сохранить файл перед выходом. Мы сделали правки в документе, но мы не хотим их сохранять, так как нам нужен чистый шаблон для последующей работы.
После того, как мы закончили с кодом, можем загрузить нашу страницу с формой, забить некоторые значения, и отправить её. Нижеприведенные изображения показывают результат работы скрипта, а также обновленный документ Word:
Улучшение скорости обработки и немного подробнее о PIA
PHP — слабо типизированный язык. Объект COM типа Object
. Во время написания скрипта у нас нет возможности получить описание объекта, будь оно приложением Word, документом или полем. Мы не знаем, какие свойства есть у этого объекта, или какие он поддерживает методы.
Это сильно замедлит скорость разработки. Чтобы ускорить разработку, я бы рекомендовал писать функции сначала на C#, а после переводить код в PHP. Я могу рекомендовать бесплатную IDE для разработки на C# под названием “#develop”. Найти ее можно здесь. Я предпочитаю ее Visual Studio, так как #develop меньше, проще и быстрее.
Миграция C# кода в PHP не так страшна, как кажется. Давайте я покажу вам пару строк на C#:
Word.Application w=new Word.Application(); w.Visible=true; String path=Application.StartupPath+"\template.docx"; Word.Document d=w.Documents.Open(path) as Word.Document; Word.Fields flds=d.Fields; int len=flds.Count; foreach (Word.Field f in flds) { f.Select(); int i=f.Index; w.Selection.TypeText("..."); }
Можно заметить, что код на C# очень похож на код PHP, который я показывал ранее. C# — строго типизированный язык, так что в этом примере можно заметить несколько операторов приведения типов, а также переменным необходимо указывать тип.
С указанием типа переменной, можно наслаждаться более понятным кодом и автодополнением, и скорость разработки существенно повышается.
Другой способ повысить скорость разработки на PHP — вызывать макрос в Word. Мы проводим ту же последовательность действий, а после сохраняем ее как макрос. Макрос написан на Visual Basic, который также просто перевести в PHP.
И, что самое важное — документация по Office PIA от Microsoft, особенно документация по пространствам имен каждого приложения Office является самым детальным справочным материалом. Наиболее используемые три приложения:
- Excel 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel(v=office.15).aspx
- Word 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.word(v=office.15).aspx
- PowerPoint 2013: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.powerpoint(v=office.15).aspx
Заключение
В этой статье мы показали, как заполнить данными документ Word с помощью библиотек PHP COM и возможностями взаимодействия Microsoft Office.
Windows и Office широко используются в повседневной жизни. Знать силу Office/Window и PHP будет полезно каждому PHP и Windows разработчику.
С помощью расширения PHP COM вам открывается дверь к использованию этой комбинации.
Первое с чего нужно начать, это создать .docx документ на своем ПК, например template.docx
Для примера я взял куски из договора на создание сайта
Подготавливаем шаблон word документа
Открываем word файл и начинаем его шаблонизировать путем замены текста на переменные синтаксиса типа ${data}
У нас будут следующие переменные, которые мы будем подставлять в документ:
${num_dogovor}
— номер догвоора
${city}
— город
${date}
— текущая дата
${name}
— ФИО
${company}
— Название Организации ООО
${summa}
— Сумма
${summa_str}
— Сумма, прописью
${summa_nalog}
— Налог, 6% от суммы
${summa_nalog_str}
— Налог, 6% от суммы (прописью)
${ur_address}
— Юр. адрес
${post_address}
— Почтовый адрес
${company_ogrn}
— ОГРН
${company_okpo}
— ОКПО
${company_kpp}
— КПП
${company_inn}
— ИНН организации
${company_bank}
— Название банка
${company_ks}
— кор. счет
${company_rs}
— р. счет
${direktor}
— ФИО директора
Далее скачиваем библиотеку PhpWord
//Подключаем библиотеку
require $_SERVER["DOCUMENT_ROOT"].'/lib/phpword/autoload.php';
//создаем класс
$phpWord = new PhpOfficePhpWordPhpWord();
$_doc = new PhpOfficePhpWordTemplateProcessor('template.docx');
Синтаксис для замены переменных
$_doc->setValue('num_dogovor', $number_document);
Подготовим пару переменных
//запихиваем сумму в переменную, что бы далее с ней поработать
$summa = 25550;
// делаем красивый формат
$summa_format = number_format($summa, 2, ',', ' ');
// вычислим налог от суммы (6%) и так же определим в отдельную переменную красивый формат суммы
$summa_nalog = $summa * 6 / 100;
$summa_nalog_format = number_format($summa_nalog, 2, ',', ' ');
Подставляем, заменяем переменные в word документ
$_doc->setValue('num_dogovor', $number_document);
$_doc->setValue('city', "г. Сочи");
$_doc->setValue('name', "Масков Илон Гениальнович");
$_doc->setValue('date', date("d.m.Y"));
$_doc->setValue('company', "ООО НЕ ПРОХОДИТЕ МИМО");
$_doc->setValue('summa', $summa_format);
$_doc->setValue('summa_str', num2str($summa));
$_doc->setValue('summa_nalog', $summa_nalog);
$_doc->setValue('summa_nalog_str', num2str($summa_nalog));
$_doc->setValue('company_ogrn', "ОГРН компании");
$_doc->setValue('company_inn', "ИНН компании");
$_doc->setValue('company_kpp', "КПП компании");
$_doc->setValue('company_bank', "Какое то название банка");
$_doc->setValue('company_bik', "бик банка");
$_doc->setValue('company_ks', "12342352456235");
$_doc->setValue('company_rs', "66666666666");
$_doc->setValue('ur_address', "Юридический адрес, какой-нибудь");
$_doc->setValue('post_address', "Фактический адрес");
$_doc->setValue('direktor', "Альберт Енштейн");
$_doc->setValue('company_okpo', "4444444");
Сохраняем сгенерированный word файл на сервер
$img_Dir_Str = "/files/";
$img_Dir = $_SERVER['DOCUMENT_ROOT']."/". $img_Dir_Str;
@mkdir($img_Dir, 0777);
$file = str_replace("/","-", "Договор №".date("d-m-Y")).".docx";
$_doc->saveAs($img_Dir.$file);
Обратите внимание на строку: $_doc->setValue('summa_str', num2str($summa));
и $_doc->setValue('summa_nalog_str', num2str($summa_nalog));
В ней мы используем функцию перевода числа в прописной вид
Функция перевода числа в прописной вид
function num2str($num) {
$nul='ноль';
$ten=array(
array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
);
$a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
$tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
$hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
$unit=array( // Units
array('коп.' ,'коп.' ,'коп.', 1),
array('рубль' ,'рубля' ,'рублей' ,0),
array('тысяча' ,'тысячи' ,'тысяч' ,1),
array('миллион' ,'миллиона','миллионов' ,0),
array('миллиард','милиарда','миллиардов',0),
);
//
list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
$out = array();
if (intval($rub)>0) {
foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
if (!intval($v)) continue;
$uk = sizeof($unit)-$uk-1; // unit key
$gender = $unit[$uk][3];
list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
// mega-logic
$out[] = $hundred[$i1]; # 1xx-9xx
if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
// units without rub & kop
if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
} //foreach
}
else $out[] = $nul;
$out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
$out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}
/**
* Склоняем словоформу
* @ author runcore
*/
function morph($n, $f1, $f2, $f5) {
$n = abs(intval($n)) % 100;
if ($n>10 && $n<20) return $f5;
$n = $n % 10;
if ($n>1 && $n<5) return $f2;
if ($n==1) return $f1;
return $f5;
}
Статья подготовлена для Вас сайтом kisameev.ru
Перевел: Кисамеев Дмитрий
Урок создан: 3 октября 2021 г.
Статью просмотрели: 8679
Понравилось: 17
str_word_count
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
str_word_count —
Возвращает информацию о словах, входящих в строку
Описание
mixed str_word_count
( string $string
[, int $format
= 0
[, string $charlist
]] )
Для этой функции «слово» обозначает строку с алфавитными
символами, зависящую от локали, которая также может содержать
символы «‘» и «-«, но не может начинаться с
них.
Список параметров
-
string
-
Строка
-
format
-
Указывает возвращаемое значение данной функции. На данный момент
поддерживаются следующие значения:-
0 — возвращает количество найденных слов
-
1 — возвращается массив, содержащий все слова, входящие в строку
string
-
2 — возвращается массив, индексами которого являются позиции в
строкеstring
, а значениями — соответствующие слова.
-
-
charlist
-
Список дополнительных символов, которые будут рассматриваться как «слово»
Возвращаемые значения
Возвращает массив или целое число, в зависимости от указанного
параметра format
.
Список изменений
Версия | Описание |
---|---|
5.1.0 |
Добавлен параметр charlist
|
Примеры
Пример #1 Пример использования str_word_count()
<?php
$str
= "Hello fri3nd, you're
looking good today!";print_r(str_word_count($str, 1));
print_r(str_word_count($str, 2));
print_r(str_word_count($str, 1, 'àáãç3'));
echo
str_word_count($str);?>
Результат выполнения данного примера:
Array ( [0] => Hello [1] => fri [2] => nd [3] => you're [4] => looking [5] => good [6] => today ) Array ( [0] => Hello [6] => fri [10] => nd [14] => you're [29] => looking [46] => good [51] => today ) Array ( [0] => Hello [1] => fri3nd [2] => you're [3] => looking [4] => good [5] => today ) 7
Смотрите также
- explode() — Разбивает строку с помощью разделителя
- preg_split() — Разбивает строку по регулярному выражению
- split() — Разбиение строки на массив по регулярному выражению
- count_chars() — Возвращает информацию о символах, входящих в строку
- substr_count() — Возвращает число вхождений подстроки
Вернуться к: Обработка строк
От автора: не так давно на нашем сайте были опубликованы уроки по работе с таблицами Microsoft Excel средствами языка PHP, которые вызвали значительный интерес у нашей аудитории и поэтому, сегодня я решил показать Вам, как создавать документы Microsoft Word ,формата .docx, используя мощнейшую библиотеку PHPWord.
Актуальную версию библиотеки PHPWord, вы найдете на сервисе GitHub.
На данной странице, приведено краткое описание и инструкция по установке библиотеки. Но данная инструкция очень ограничена и не описывает всех возможностей библиотеки, поэтому, официальную PHPWord документацию, для разработчиков, Вы найдете по ссылке.
Установка PHPWord
Установка PHPWord, может быть выполнена двумя способами. Первый способ – ручной, при котором Вы скачиваете архив с последней актуальной версией PHPWord, далее, выполняете распаковку, копируете файлы в собственный проект и подключаете на соответствующих страницах. То есть достаточно стандартный способ. И второй – так сказать, автоматический способ установки, используя инструмент Composer, который мы будем использовать в данном уроке.
Кстати, Вы, наверное, заметили, что в своих уроках, для установки различных библиотек, я призываю Вас использовать Composer. Так как для простых проектов, в ручную, вполне можно скачивать необходимые элементы, но если мы работаем над более сложным скриптом, то порой затруднительно скачать все необходимые элементы и правильно их установить.
Итак, открываем командную строку и переходим в каталог нашего проекта, используя команду “CD имя папки”.
Далее, используя конструкцию “composer require”, указываем от какой библиотеки “зависит” наш проект и выполняем инструкцию.
composer require phpoffice/phpword |
После того как Composer, завершил скачивание и установку библиотеки, необходимо подключить файл autoload.php, который расположен в папке vendor, к Вашему проекту.
require ‘vendor/autoload.php’; |
Далее, создаем объект главного класса библиотеки.
$phpWord = new PhpOfficePhpWordPhpWord(); |
Обратите внимание, что PHPWord, в своей структуре, использует пространства имен, поэтому для доступа к классу, необходимо использовать полное квалификационное имя, если мы работаем в глобальном пространстве имен. На этом установка библиотеки завершена.
Создание документа MS Word
Теперь, мы можем сформировать свой первый документ MS Word средствами языка PHP. Для этого, первым делом определим шрифт, используя метод setDefaultFontName(имя шрифта), который будет использоваться, по умолчанию, для отображения текстовых данных.
$phpWord—>setDefaultFontName(‘Times New Roman’); |
Затем зададим, размер шрифта, при помощи метода setDefaultFontSize(размер шрифта).
$phpWord—>setDefaultFontSize(14) |
Перед добавлением текстовых данных, необходимо определить параметры всего документа в целом. Для получения объекта параметров документа, используем метод getDocInfo().
$properties = $phpWord—>getDocInfo(); |
Используя полученный объект, зададим основные параметры документа.
$properties—>setCreator(‘Name’); $properties—>setCompany(‘Company’); $properties—>setTitle(‘Title’); $properties—>setDescription(‘Description’); $properties—>setCategory(‘My category’); $properties—>setLastModifiedBy(‘My name’); $properties—>setCreated(mktime(0, 0, 0, 3, 12, 2015)); $properties—>setModified(mktime(0, 0, 0, 3, 14, 2015)); $properties—>setSubject(‘My subject’); $properties—>setKeywords(‘my, key, word’); |
При этом использовались следующие методы (каждый метод устанавливает определенный глобальный параметр документа):
setCreator() – автор документа;
setCompany() – организация автора документа;
setTitle() – заголовок документа;
setDescription() – краткое описание документа;
setCategory() – категория документа;
setLastModifiedBy() – автор последнего редактирования документа;
setCreated() – дата создания документа;
setModified() – дата редактирования документа;
setSubject() – тема документа;
setKeywords() – ключевые слова документа.
Собственно, теперь мы можем добавить необходимые текстовые данные в будущий документ MS Word, но перед этим мы должны определиться с понятием раздела, которое используется библиотекой PHPWord, для работы с документом.
Итак, раздел или секция – это специальная область прямоугольной формы, внутри которой размещаются элементы документа, такие как текст, изображения, списки, таблицы и т.д. А значит, перед добавлением информации в будущий документ, необходимо создать раздел, что мы собственно и выполним, используя метод addSection(массив стилей).
$sectionStyle = array( ‘orientation’ => ‘landscape’, ‘marginTop’ => PhpOfficePhpWordSharedConverter::pixelToTwip(10), ‘marginLeft’ => 600, ‘marginRight’ => 600, ‘colsNum’ => 1, ‘pageNumberingStart’ => 1, ‘borderBottomSize’=>100, ‘borderBottomColor’=>‘C0C0C0’ ); $section = $phpWord—>addSection($sectionStyle); |
Данный метод, в качестве результата работы возвращает объект созданного раздела, который мы сохраним в переменную. При вызове метода, в качестве первого параметра, можно передать массив настроек, которые будут использоваться для создания раздела (каждая настройка представляет собой отдельную ячейку массива). В примере Выше, я использовал следующие настройки:
orientation — расположение раздела, в виде альбомного листа (значение по умолчанию portrait);
marginTop – верхний отступ;
marginLeft – отступ от левого края;
marginRight – отступ от правого края;
colsNum – количество колонок, в которых будут отображаться данные;
pageNumberingStart – страница, с которой будет начата нумерация страниц;
borderBottomSize – размер нижней рамки;
borderBottomColor – цвет нижней рамки.
Полный список настроек приведен в разделе “Styles”, официальной документации PHPWord.
При, этом у Вас, скорее всего, возник вопрос, в каких единицах измерения проставляются значения размеров и отступов? В качестве единиц измерений используются типографические твипы.
Твип (англ. twip) — типографская единица измерения, равная одной двадцатой пункта, или 1/1440 дюйма, или 1/567 сантиметра (приближённо).
Конечно, разработчикам не совсем удобно использовать данную единицу измерения, для определения размеров, поэтому библиотека PHPWord, содержит в своем составе, специальный класс конвертер, основных известных единиц в твипы. К примеру, для конвертации “пискселей в твипы”, необходимо использовать следующий метод pixelToTwip() , который переведет значение в пикселях, передаваемое в качестве первого параметра в твипы.
PhpOfficePhpWordSharedConverter::pixelToTwip(10) |
Для добавления текста, в будущий документ, необходимо использовать метод addText($text, [$fontStyle], [$paragraphStyle]). В качестве параметров, при вызове данного метода, необходимо передать следующее:
$text – текст, который необходимо отобразить на странице документа. При этом текст не должен содержать тегов HTML, поэтому, как правило, его обрабатывают функцией htmlspecialchars().
$fontStyle – массив с настройками шрифта, который будет использоваться для отображения текста. Полный список доступных настроек, Вы найдете на странице “Styles” в разделе “Font”, официальной документации.
$paragraphStyle – массив с настройками параграфа, или абзаца, в котором будет отображен текст. Полный список доступных настроек, Вы найдете на странице “Styles” в разделе “ Paragraph”, официальной документации.
Теперь, используем рассмотренный Выше метод и добавим текст, в будущий документ.
$text = «PHPWord is a library written in pure PHP that provides a set of classes to write to and read from different document file formats.»; $fontStyle = array(‘name’=>‘Arial’, ‘size’=>36, ‘color’=>‘075776’, ‘bold’=>TRUE, ‘italic’=>TRUE); $parStyle = array(‘align’=>‘right’,‘spaceBefore’=>10); $section—>addText(htmlspecialchars($text), $fontStyle,$parStyle); |
Настройки шрифта, использованные в примере:
name – имя шрифта;
size – размер шрифта;
color – цвет шрифта;
bold – если, true, будет использован жирный шрифт;
italic — если, true, будет использован курсив.
Настройки параграфа из примера:
align – выравнивание текста в параграфе, в нашем случае по правому краю;
spaceBefore – расстояние до параграфа.
Теперь давайте, непосредственно, создадим документ MS Word.
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord,‘Word2007’); $objWriter—>save(‘doc.docx’); |
Для создания документа, необходимо создать объект специального класса Word2007, используя статический метод createWriter(), класса IOFactory. Класс IOFactory – реализует шаблон проектирования Factory, и необходим для создания объектов других классов, имена которых мы передаем в качестве, второго параметра при вызове метода createWriter(). Далее вызывая метод save() и передавая в качестве первого параметра, имя будущего файла, мы формируем документ MS Word.
Как Вы видите, документ успешно создан. Если, не нужно создавать файл, а сформированный документ, необходимо отдать пользователю на скачивание, то при вызове метода save(), в качестве первого параметра, необходимо передать строку «php://output». При этом, так же, необходимо указать определенный набор заголовков.
header(«Content-Description: File Transfer»); header(‘Content-Disposition: attachment; filename=»first.docx»‘); header(‘Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document’); header(‘Content-Transfer-Encoding: binary’); header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’); header(‘Expires: 0’); $objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, ‘Word2007’); $objWriter—>save(«php://output»); |
Добавление списков
Для формирования списков, в будущем документе, необходимо использовать метод addListItem($text, [$depth], [$fontStyle], [$listStyle], [$paragraphStyle]), который за каждый свой вызов, формирует элемент списка. Параметры, которые необходимо передать при вызове метода:
$text – текст, элемента списка;
$depth – глубина вложенности. Если создается одноуровневый список, то данный параметр равен 0.
$fontStyle – массив настроек шрифта, по аналогии с добавлением простого текста.
$listStyle – массив настроек списка.
$paragraphStyle – массив настроек параграфа, по аналогии с добавлением текста.
Массив настроек списка $listStyle, поддерживает настройку – listType, то есть, тип списка, к примеру, нумерованный или же нет. В качестве значений, доступны специальные константы класса PhpOfficePhpWordStyleListItem:
TYPE_SQUARE_FILLED FILLED – не нумерованный список. В виде маркеров используются квадраты.
TYPE_BULLET_FILLED – не нумерованный список (значение по умолчанию). В виде маркеров используются точки.
TYPE_BULLET_EMPTY FILLED – не нумерованный список. В виде маркеров используются не закрашенные окружности.
TYPE_NUMBER – нумерованный список.
TYPE_NUMBER_NESTED – многоуровневый нумерованный список.
TYPE_ALPHANUM – нумерованный список, с использованием букв, в качестве маркеров.
Таким образом, следующий код, добавит одноуровневый нумерованный список в документ.
$fontStyle = array(‘name’ => ‘Times New Roman’, ‘size’ => 16,‘color’ => ‘075776’,‘italic’=>true); $listStyle = array(‘listType’=>PhpOfficePhpWordStyleListItem::TYPE_BULLET_EMPTY); $section—>addListItem(‘Элемент 1’,0,$fontStyle,$listStyle); $section—>addListItem(‘Элемент 2’,0,$fontStyle,$listStyle); $section—>addListItem(‘Элемент 3’,0,$fontStyle,$listStyle); $section—>addListItem(‘Элемент 4’,0,$fontStyle,$listStyle); $section—>addListItem(‘Элемент 5’,0,$fontStyle,$listStyle); |
Добавление изображений
Для добавления изображений, необходимо использовать метод addImage($path,[$imgStyle]). При вызове данного метода, в качестве первого параметра, передается путь к изображению, которое необходимо добавить в документ. В качестве второго, необязательного параметра, можно передать массив с настройками отображения изображения. Полный список настроек изображения, Вы найдете на странице “Styles”, в разделе “ Image”.
Соответственно, давайте добавим изображение в создаваемый документ.
$section—>addImage(‘picture.jpg’, array( ‘width’ => 100, ‘height’ => 100, )); |
При этом, в качестве настроек, я определил ширину и высоту добавляемого изображения.
На этом данный урок я буду завершать. Как Вы видите, библиотека PHPWord, обладает огромнейшим функционалом и позволяет формировать документы MS Word различной сложности. Если она Вас заинтересовала, то изучайте более подробно официальную документацию, потому как мы с Вами рассмотрели только некоторые ее возможности. Всего Вам доброго и удачного кодирования!!!
Обзор PHP-функций для работы со строками и практическое их применение с учетом кодировки UTF-8.
1
Количество символов
Получить длину строки
Функция strlen($string) возвращает длину строки, но возвращает неправильный результат если в строке есть кириллица в UTF-8, поэтому нужно использовать mb_strlen()
.
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo strlen($text); // 105
echo mb_strlen($text); // 59
PHP
Количество символов без пробелов
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_ereg_replace('[s]', '', $text);
echo mb_strlen($str); // 49
PHP
Количество слов с строке
Функция str_word_count() возвращает количество слов в строке, но символы обрамленные пробелами будет считаться за слово, например « — ». Так же функция не работает с UTF-8, как видно в примере:
$text = 'Lorem Ipsum - is simply dummy!';
echo str_word_count($text); // 6
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo str_word_count($text); // 1
PHP
Рабочий вариант:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[[:punct:]]/", '', $text);
$str = mb_ereg_replace('[s]+', ' ', $str);
$words = explode(' ', $str);
echo count($words); // 10
PHP
Получить количество переносов в строке
$text = 'Съешь ещё - этих
мягких французских булок,
да выпей же чаю.';
echo substr_count($text, PHP_EOL); // 2
PHP
Количество букв в строке
$text = 'Съешь ещё этих мягких французских булок, да выпей же чаю.';
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $text);
echo mb_strlen($str); // 46
PHP
Количество цифр в строке
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace('/[^0-9]/ui', '', $text);
echo mb_strlen($str); // 0
PHP
Количество знаков препинания
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[^[:punct:]]/", '', $text);
echo mb_strlen($str); // 3
PHP
Количество пробелов в строке
Или количество вхождений любого другого символа или подстроки.
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo substr_count($text, ' '); // 10
PHP
Количество пробелов в начале строки:
$text = ' Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strlen($text) - mb_strlen(ltrim($text, ' ')); // 5
PHP
Количество пробелов в конце строки:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю. ';
echo mb_strlen($text) - mb_strlen(rtrim($text, ' ')); // 3
PHP
2
Поиск
Получить количество вхождений подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_substr_count($text, 'ещё'); // 2
PHP
Найти позицию первого вхождения подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strpos($text, 'ещё'); // 6
// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_stripos($text, 'ещё'); // 6
PHP
Найти позицию последнего вхождения подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strrpos($text, 'ещё'); // 46
// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strirpos($text, 'ещё'); // 46
PHP
Найти все вхождения подстроки
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
$offset = 0;
$allpos = array();
while (($pos = mb_strpos($text, 'ещё', $offset)) !== false) {
$offset = $pos + 1;
$allpos[] = $pos;
}
print_r($allpos); // Array ([0] => 6 [1] => 46)
PHP
3
Извлечение из текста
Начало строки
Получить первый символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 1); // С
PHP
Получить три первых символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 3); // Съе
PHP
Получить первое слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', true); // Съешь
PHP
Получить все после первого слова:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', false); // ещё - этих мягких французских булок, да выпей же чаю.
PHP
Конец строки
Получить последний символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 1); // .
PHP
Получить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 3); // аю.
PHP
Получить последнее слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo end($array); // чаю.
PHP
Получить всё до последнего слова:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $str; // Съешь ещё - этих мягких французских булок, да выпей же
PHP
Середина строки
Получить второе слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo $array[1]; // ещё
PHP
Получить текст до дефиса:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, mb_strpos($text, ' - ')); // Съешь ещё
PHP
Получить текст после дефиса:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, mb_strpos($text, ' - ') + mb_strlen(' - '), -1);
echo $str; // этих мягких французских булок, да выпей же чаю
PHP
Переносы строк
Получить первую строку:
$text = 'Разнообразный опыт укрепление и развитие структуры требуют
определения направлений прогрессивного развития! Не следует забывать,
что постоянный рост и сфера активности в степени обуславливает создание
системы обучения кадров? С другой стороны дальнейшее развитие различных
форм влечет за собой процесс внедрения и модернизации.';
$pos = mb_strpos($text, "n");
$str = trim(mb_substr($text, 0, $pos));
echo $str; // Разнообразный опыт укрепление и развитие структуры требуют
// или
$lines = explode("n", $text);
echo $lines[0]; // Разнообразный опыт укрепление и развитие структуры требуют
PHP
Получить последнюю строку:
$text = 'Разнообразный опыт укрепление и развитие структуры требуют
определения направлений прогрессивного развития! Не следует забывать,
что постоянный рост и сфера активности в степени обуславливает создание
системы обучения кадров? С другой стороны дальнейшее развитие различных
форм влечет за собой процесс внедрения и модернизации.';
$pos = mb_strrpos($text, "n");
$str = trim(mb_substr($text, $pos));
echo $str; // форм влечет за собой процесс внедрения и модернизации.
// или
$lines = explode("n", $text);
echo end($lines); // форм влечет за собой процесс внедрения и модернизации.
PHP
Пилучить символы из ковычек и скобок
$text = ''Съешь' "ещё" «этих» [мягких] (французских) {булок} <да>';
// '...'
preg_match_all("/'(.+?)'/", $text, $matches);
echo $matches[1][0]; // Съешь
// "..."
preg_match_all("/"(.+?)"/", $text, $matches);
echo $matches[1][0]; // ещё
// «...»
preg_match_all("/«(.+?)»/", $text, $matches);
echo $matches[1][0]; // этих
// [...]
preg_match_all("/[(.+?)]/", $text, $matches);
echo $matches[1][0]; // мягких
// (...)
preg_match_all("/((.+?))/", $text, $matches);
echo $matches[1][0]; // французских
// {...}
preg_match_all("/{(.+?)}/", $text, $matches);
echo $matches[1][0]; // булок
// <...>
preg_match_all("/<(.+?)>/", $text, $matches);
echo $matches[1][0]; // да
PHP
4
Замена в строках
Функция substr_replace($search, $replace, $subject, $count) – заменяет часть строки, также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому приходится использовать пользовольскую функцию:
if (!function_exists('mb_substr_replace')) {
function mb_substr_replace($original, $replacement, $position, $length)
{
$startString = mb_substr($original, 0, $position, 'UTF-8');
$endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
$out = $startString . $replacement . $endString;
return $out;
}
}
PHP
Заменить первый символ:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', 0, 1); // !ъешь ещё - этих мягких французских булок.
PHP
Заменить три первых символа:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', 0, 3); // !!!шь ещё - этих мягких французских булок.
PHP
Заменить последний символ:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', -1, 0); // Съешь ещё - этих мягких французских булок!
PHP
Заменить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', -3, 0); // Съешь ещё - этих мягких французских бул!!!
PHP
Замена символов и слов в строке
Для этой задачи подходит функция str_replace($search, $replace, $subject), которая работает со всеми кодировками.
Заменить пробелы:
$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace(' ', '-', $text); // Съешь-ещё---этих-мягких-французских-булок.
PHP
Заменить слово:
$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace('мягких', 'твердых', $text); // Съешь ещё - этих твердых французских булок.
PHP
Заменить всё до дефиса:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = 'Не ешь' . mb_substr($text, mb_strpos($text, ' - '), -1);
echo $str; // Не ешь - этих мягких французских булок
PHP
Заменить всё после дефиса:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = mb_substr($text, 0, mb_strpos($text, ' - ') + 3) . 'печенек';
echo $str; // Съешь ещё - печенек
PHP
5
Добавление в строки
Добавить строку после 10-го символа:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = mb_substr_replace($text, '!!!', 10, 0);
echo $str; // Съешь ещё !!!- этих мягких французских булок.
PHP
Добавить перед словом:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' же ещё ', $text);
echo $str; // Съешь же ещё - этих мягких французских булок.
PHP
Добавить после слова:
$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' ещё немного ', $text);
echo $str; // Съешь ещё немного - этих мягких французских булок.
PHP
Вставить строку между всех символов
Для того чтобы вставить символ между всех символов в строке понадобится функция str_split($string) для пробразавания строки в массив, она также не работает с кирилицей. С версии PHP 7.4 появилась функция mb_str_split()
, для более ранних версий:
if (!function_exists('mb_str_split')) {
function mb_str_split($str, $l = 0) {
if ($l > 0) {
$ret = array();
$len = mb_strlen($str, "UTF-8");
for ($i = 0; $i < $len; $i += $l) {
$ret[] = mb_substr($str, $i, $l, "UTF-8");
}
return $ret;
}
return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
}
}
PHP
$text = 'Съешь ещё - этих мягких французских булок.';
$array = mb_str_split($text);;
$new = implode(' ', $array);
echo $new; // С ъ е ш ь е щ ё - э т и х м я г к и х ф р а н ц у з с к и х б у л о к .
PHP
Дописать строку до нужной длины
Функция str_pad($string, $length, $pad_string, $pad_type) дополняет строку другой строкой до заданной длины.
Версия функции для UTF-8:
if (!function_exists('mb_str_pad')) {
function mb_str_pad($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT)
{
$diff = strlen($input) - mb_strlen($input);
return str_pad($input, $pad_length + $diff, $pad_string, $pad_type);
}
}
PHP
Дописать стркуку слева:
$text = 'Привет Мир';
echo mb_str_pad($text, 20, '-', STR_PAD_LEFT); // ----------Привет Мир
PHP
Дописать строку справа:
$text = 'Привет Мир';
echo mb_str_pad($text, 20, '-', STR_PAD_RIGHT); // Привет Мир----------
PHP
Дописать строку с обеих сторон:
$text = 'Привет Мир';
echo mb_str_pad($text, 20, '-', STR_PAD_BOTH); // -----Привет Мир-----
PHP
6
Удаление из строк
Удаление в начале строки
Удалить первый символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 1);
echo $new; // ъешь ещё - этих мягких французских булок, да выпей же чаю.
PHP
Удалить первые 3 символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 3);
echo $new; // шь ещё - этих мягких французских булок, да выпей же чаю.
PHP
Удалить первое слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, mb_strpos($text, ' '));
echo $new; // ещё - этих мягких французских булок, да выпей же чаю.
PHP
Удаление в конце строки
Удалить последний символ:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -1);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же чаю
PHP
Удалить три последних символа:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -3);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же ч
PHP
Удалить последнее слово:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же
PHP
Удаление подсторк
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = str_replace(' мягких', '', $text);
echo $new; // Съешь ещё - этих французских булок, да выпей же чаю.
PHP
Удалить всё перед сиволом:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-');
echo $new; // - этих мягких французских булок, да выпей же чаю.
PHP
Удалить всё после сивола:
$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-', true);
echo $new; // Съешь ещё
// Второй вариант:
$pos = mb_strpos($text, '-');
$new = mb_substr($text, 0, $pos + 1);
echo $new; // Съешь ещё -
PHP
На момент написания данной статьи релиз PHPWord датируется 8 июля 2011 года. Да еще бета версия. Конечно старовата, но с другой стороны, если класс хорошо выполняет поставленную задачу, то почему бы и нет?!
К делу: скачиваем, подключаем обычным инклюдом и вперед.
Создаем экземпляр класса:
$PHPWord = new PHPWord();
Необязательно, но можем добавить, что по-умолчанию используем шрифт Arial размером 14 пунктов.
$PHPWord->setDefaultFontName(‘Arial’);
$PHPWord->setDefaultFontSize(14);
Добавляем новый раздел в документ:
$section = $PHPWord->createSection([array $sectionStyle]);
По-умолчанию этот метод создает страницу A4 книжной ориентации. Поля: по 2,5 см верхнее, левое и правое и 2 см нижнее.
Массив $sectionStyle может содержать:
$sectionStyle = array(
‘orientation’ => ‘landscape’, // альбомная ориентация страницы
‘marginTop’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа сверху
‘marginLeft’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа слева
‘marginRight’ => ‘0’, // по-умолчанию равен 1418* и соответствует 2,5 см отступа справа
‘marginBottom’ => ‘0’, // по-умолчанию равен 1134* и соответствует 2 см отступа снизу
‘pageSizeW’ => ‘8419’, // по-умолчанию равен 11906* и соответствует 210 мм по ширине
‘pageSizeH’ => ‘11906’, // по-умолчанию равен 16838* и соответствует 297 мм по высоте
‘borderColor’=>’999999’, // Цвет ненужного бордюра
‘borderSize’=>’100’, // Ширина ненужного бордюра*
);
* В качестве единиц измерения тут используются типографские твипы. Для справки: 1 твип равен 1/567 см.
Текст
У нас есть пустая страница. Для начала добавим обычную текстовую строку. Для этого существует метод addText() и два синтаксиса:
$section->addText(string $text[, array $textStyle]);
// или
$section->addText(string $text[, string $fontStyleName[, string $paragraphStyleName]]);
На практике выглядит это так:
$section->addText(‘Создание сайтов — Лаборатории WEB’);
Тут стоит сделать замечание: автор PHPWord решил, что все, кто будет пользоваться его классом будут работать в кодировке отличной от UTF-8. Если просматривать код PHPWord, то там везде, как через мясорубку, все текстовые переменные проходят через utf8_encode(). Вот в моем случае это сыграло не на руку, потому что я как раз-то работаю с UTF-8.
Что делать, если вы тоже работаете с UTF-8? Варианта как минимум два:
- перед тем как отдать строки в PHPWord измените их кодировку на не UTF-8 с помощью iconv();
- прошерстите PHPWord и удалите все utf8_encode() оттуда.
Мной был выбран второй вариант.
Двигаемся дальше… Наведем «красоту» в тексте.
Первый вариант — это объявление всякой «красоты» непосредственно в методе addText().
$section->addText(‘Разработка сайтов — Лаборатория WEB’, array(
‘name’ => ‘Tahoma’,
‘color’ => ‘990000’,
‘bold’ => true,
‘italic’ => true,
‘size’ => 16,
));
Второй вариант — объединение набора «красот» в стиль.
$PHPWord->addFontStyle(‘fStyle’, array(
‘name’ => ‘Tahoma’,
‘color’ => ‘990000’,
‘bold’ => true,
‘italic’ => true,
‘size’ => 16,
));
$section->addText(‘Изготовление сайтов — Лаборатория WEB’, ‘fStyle’);
Сейчас был задан стиль для шрифта, но можно задать стиль и для параграфа:
$PHPWord->addParagraphStyle(‘pStyle’, array(
‘align’ => ‘center’,
‘spaceBefore’ => 100, // отступ сверху
‘spaceAfter’ => 100, // отступ снизу
‘spacing’ => 100, // межстрочный интервал
));
И использовать эти стили как совместно, так и по-отдельности:
$section->addText(‘Поддержка сайтов — Лаборатория WEB’, ‘fStyle’, ‘pStyle’);
// или
$section->addText(‘Продвижение сайтов — Лаборатория WEB’, null, ‘pStyle’);
Если вам нужно объединить в одном параграфе несколько текстовых блоков с разным форматированием, то для этого существует метод createTextRun():
$textrun = $section->createTextRun(‘pStyle’);
$textrun->addText(‘Жирный’, array(
‘bold’ => true
));
$textrun->addText(‘Курсив’, array(
‘italic’ => true
));
$textrun->addText(‘Красный’, array(
‘color’=>’990000’
));
С текстом, вроде, все ясно. Перенос курсора на следующую строку:
$section->addTextBreak([int $number]); // В скобках указывается количество строк на которое нужно перейти. По-умолчанию $number = 1
Изображения
Изображения вставляются также просто, как и текст. Для этого используется метод addImage():
$section->addImage(string $srcLocalImage[, array $imageStyle]);
Массив $imageStyle может содержать:
$imageStyle = array(
‘width’ => ‘200’, // в пикселях
‘height’ => ‘200’, // в пикселях
‘align’ => ‘center’, // left || right || center
)
На практике это выглядит так:
$section->addImage(‘path-to-image.png’, $imageStyle);
Ссылки
Метод для добавления ссылки addLink():
$section->addLink(string $url, [string $text[, string $linkFontStyle[, string $paragraphStyle]]]);
Наведение «красоты» для ссылки:
$PHPWord->addLinkStyle(‘lStyle’, array(
‘name’ => ‘Tahoma’,
‘color’ => ‘990000’,
‘bold’ => true,
‘italic’ => true,
‘size’ => 16,
));
На практике это выглядит:
$section->addLink(‘http://www.w-lab.ru’, ‘Лаборатория WEB’, ‘lStyle’, ‘pStyle’);
Таблицы
С таблицами немного сложнее. Для добавления таблицы на страницу используем метод addTable(). Как и в случае с текстом, для таблиц существует два синтаксиса. Первый выглядит так:
$table = $section->addTable([array $tableStyle]);
Массив $tableStyle может содержать:
$tableStyle = array(
‘cellMarginTop’ => 0, // отступ от ячейки сверху *
‘cellMarginRight’ => 0, // отступ от ячейки справа *
‘cellMarginBottom’ => 0, // отступ от ячейки снизу *
‘cellMarginLeft’ => 0, // отступ от ячейки слева *
);
* в твипах.
cellMarginTop, cellMarginRight, cellMarginBottom, cellMarginLeft можно заменить одним cellMargin.
Второй синтаксис:
$table = $section->addTable([string $tableStyleName]);
Для того, чтобы назначить $tableStyleName, вызовем метод addTableStyle():
$PHPWord->addTableStyle(string $styleName, array $tableStyle[, array $firstRowTableStyle]);
Как можно понять из названия, массив $firstRowTableStyle отвечает за стили первой строки таблицы.
На практике:
$word->addTableStyle(‘tStyle’, array(
‘borderSize’ => 6,
‘borderColor’ => ‘999999’,
‘cellMarginTop’ => 40,
‘cellMarginRight’ => 20,
‘cellMarginBottom’ => 40,
‘cellMarginLeft’ => 20,
), array(
‘borderSize’ => 12,
‘borderColor’ => ‘000000’,
‘cellMargin’ => 80,
));
$table = $section->addTable(‘tStyle’);
Тут мы назначили для ячеек всей таблицы ширину границы 6, цвет серый, с отступами 40 20 40 20. А для ячеек первой строки ширину границы 12, черного цвета с отступами 80 со всех сторон.
Теперь в таблицу нужно добавить строку. Для этого существует метод addRow():
$table->addRow([int $rowHeight]); // $rowHeight — высота строки в твипах
И методом addCell() добавляем ячейку:
$cell = $table->addCell(int $cellWidth[, array $cellStyle]);
Здесь $cellWidth — ширина ячейки в твипах, а массив $cellStyle может содержать:
$cellStyle = array(
‘valign’ => ‘center’, // top || bottom || center || both
‘textDirection’ => PHPWord_Style_Cell:TEXT_DIR_BTLR, // PHPWord_Style_Cell:TEXT_DIR_BTLR || PHPWord_Style_Cell:TEXT_DIR_TBRL
‘bgColor’ => ‘fafafa’,
‘borderTopSize’ => 6,
‘borderRightSize’ => 6,
‘borderBottomSize’ => 6,
‘borderLeftSize’ => 6,
‘borderSize’ => 6, // вместо borderTopSize, borderRightSize, borderBottomSize, borderLeftSize
‘borderTopColor’ => ‘999999’,
‘borderRightColor’ => ‘999999’,
‘borderBottomColor’ => ‘999999’,
‘borderLeftColor’ => ‘999999’,
‘borderColor’ => ‘999999’, // вместо borderTopColor, borderRightColor, borderBottomColor, borderLeftColor
);
Последнее, что нужно сделать — это добавить содержимое в новую ячейку (добавим текст). Сделать это можно двумя способами:
$cell = $table->addCell();
$cell->addText(‘Создание Langing Page — Лаборатория WEB’);
// или
$table->addCell()->addText(‘Разработка Langing Page — Лаборатория WEB’);
Списки
Добавление на страницу нумерованных и ненумерованных списков осуществляется методом addListItem():
$section->addListItem(string $text[, int $depth[, string $textStyle[, array $listStyle[, string $paragraphStyle]]]]);
Здесь $depth — глубина (вложенность) списка от 1 до 9, а массив $listType может состоять из:
$listType = array(
‘listType’ => PHPWord_Style_ListItem:TYPE_NUMBER, // одноуровневый нумерованный список
);
Также параметр ‘listType’ может принимать следующие значения:
- PHPWord_Style_ListItem:TYPE_NUMBER_NESTED — многоуровневый нумерованный список;
- PHPWord_Style_ListItem:TYPE_BULLET_FILLED — ненумерованный список с маркерами в виде закрашенных кругов;
- PHPWord_Style_ListItem:TYPE_BULLET_EMPTY — ненумерованный список с маркерами в виде незакрашенных кругов;
- PHPWord_Style_ListItem:TYPE_SQUARE_FILLED — ненумерованный список с маркерами в виде закрашенных квадратов.
Колонтитулы
При работе с колонтитулами нужно помнить, что они привязываются к разделу и выглядят одинаково на всех страницах, относящихся к одному и тому же разделу.
Создадим верхний и нижний колонтитулы и добавим в них содержимое:
$header = $section->createHeader();
$header->addText(‘Лаборатория WEB’);$footer = $section->createFooter();
$footer->addPreserveText(‘Страница {PAGE} из {NUMPAGES}’, array(
‘italic’ => true,
),
array(
‘align’ => ‘right’,
));
Метод addPreserveText() существует специально для добавления номеров страниц.
Разное
$section->addPageBreak(); // Разрыв страницы
Метаданные:
$meta = $PHPWord->getProperties();
$meta->setTitle(‘Название’);
$meta->setSubject(‘Тема’);
$meta->setCreator(‘Автор’);
$meta->setCompany(‘Учреждение’);
$meta->setDescription(‘Заметки’);
$meta->setCategory(‘Группа’);
$meta->setLastModifiedBy(‘Автор изменений’);
$meta->setKeywords(‘Ключевые слова’);
$meta->setCreated(time()); // Дата и время создания документа
$meta->setModified(time()); //Дата и время последнего изменения документа
Сохранение файлов
В файл на жесткий:
$writer = PHPWord_IOFactory::createWriter($PHPWord, ‘Word2007’);
$writer->save(‘document.docx’);
Вывод вопроса на скачивание:
header(«Content-Type: application/msword»);
header(«Content-Transfer-Encoding: binary»);
header(‘Content-Disposition: attachment;filename=»document.docx»‘);
header(‘Cache-Control: max-age=0’);
$writer = PHPWord_IOFactory::createWriter($PHPWord, ‘Word2007’);
$writer->save(‘php://output’);
Функция str_word_count
подсчитывает
количество слов в строке.
Функция может принимать второй необязательный
параметр, число 1
или 2
. Если
он не задан, то функция своим результатом
возвращает целое число, равное количеству слов.
Если задано 1
, то возвращается массив,
содержащий все слова, входящие в строку.
Если задано 2
, то возвращается массив,
ключами которого являются позиции в строке,
а значениями — соответствующие слова.
Синтаксис
str_word_count(строка, [число]);
Пример
Давайте подсчитаем количество в строке:
<?php
echo str_word_count('abcde my world');
?>
Результат выполнения кода:
3
Смотрите также
-
функцию
substr_count
,
которая подсчитывает количество подстрок
Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%
Привет читатель блога Lifeexample!
В силу рабочих процессов, мне часто приходится заниматься копирайтингом, что обычно подразумевает использование различных сервисов для анализа текста, в том числе и платных. Я думаю, что можно основные инструменты для копирайтинга, такие как “подсчет количества символов” и “подсчет количества слов”, а также подобные задачи, решить с помощью простого PHP скрипта.
Начнем с задачи “как посчитать количество символов на PHP”, ведь это наиболее важно при оптимизации текста.
Создание формы
Скрипт будет работать с текстом пользователя, а соответственно первым делом необходимо создать поле для ввода текста.
Создаём на локальном сервере файл index.php и пишем в него:
1 |
<html> |
Получается вот такая простенькая форма – как раз то, что нам нужно.
1. Как посчитать количество символов на PHP
Чтобы посчитать количество символов на php, насколько я помню, необходимо использовать функции strlen(). Добавим её в наш код:
1 |
<body> |
Пробуем, вводим «1111», получаем:
Вроде бы работает, пробуем «qwerty», получаем:
Неплохо! И последний контрольный, пробуем «Привет», получаем:
И снова, довольные, получаем количество символов…12…стоп! П-р-и-в-е-т – 6 букв, что-то не так.
Давайте разбираться! Оказывается, причина такого расхождения в том, что функция strlen() считает длину строки в байтах, а не в символах, а размер кириллических символов в UTF-8: по 2 байта вместо 1 для латинских, этого то я и не учёл.
Для того, чтобы правильно посчитать количество русских символов на php, необходимо использовать функцию mb_strlen() и не забыть указать кодировку:
1 |
<body> <form name=»text-form» method=»post»> |
Пробуем ещё раз с помощью php посчитать количество символов в слове «привет»:
Вот теперь всё верно!
2. Как посчитать количество символов без пробелов на PHP
Теперь давайте попробуем посчитать количество символов не считая пробелы, для этого используем функцию обработки строк str_replace( ):
1 |
<body> |
Результат:
Пишем текст «Привет мир!»
3. Как сделать, чтобы форма не очищалась после отправки
Идём дальше, как мне кажется, не совсем удобно, что текст из формы пропадает после нажатия на кнопку «Отправить». Давайте попробуем это исправить.
Для этого нам нужно, чтобы при загрузке формы проверялось, есть ли значение в Post и, если есть, подставлялось в форму.
Получилось вот так:
1 |
<body> <br/> |
4. Как посчитать количество слов на PHP
Функционал всё растёт, код всё увеличивается. Что дальше? Как посчитать количество символов на php, мы разобрались, теперь давайте попробуем посчитать количество слов.
Сначала мне пришла в голову мысль, что это можно реализовать просто посчитав все пробелы в тексте, но, как оказалось, PHP нам предлагает готовую функцию — str_word_count().
Однако, и тут всё не так просто, как кажется — попробовав функцию в деле, я обнаружил, что она тоже не умеет работать с кириллицей. Не долго думая я написал
str_word_count($text, ‘utf-8’), но функция совсем перестала работать.
Погуглив, я узнал, что заставить функцию работать правильно можно только прописав в charlist все кириллические символы, причём и верхним и нижним регистром. Что такое charlist? Сейчас объясню.
Функция str_word_count() имеет 3 параметра:
- String – строка. Обязательный параметр, переменная с текстом.
- Format — Указывает возвращаемое значение данной функции.
- 0 — возвращает количество найденных слов
- 1 — возвращается массив, содержащий все слова, входящие в строку string
- 2 — возвращается массив, индексами которого являются позиции в строке string, а значениями — соответствующие слова.
- Charlist — Список дополнительных символов, которые будут рассматриваться как «слово».
Синтаксис такой: str_word_count(String, format, ‘charlist’), например, str_word_count($text, 0, ‘абв‘).
Таким образом, наша функция должна выглядеть так:
str_word_count($str,0,»АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя»)
Немного подумав, можно укоротить эту строчку. В таблице ASCII все русские буквы (кроме «Ё» и «ё») имеют коды с 192 по 256. Также, у нас есть функция chr(), которая возвращает символ по его коду. Можно сделать простой цикл, который сам запишет в переменную буквы русского алфавита. Понадобится ещё функция iconv(), чтобы перевести текст из кодировки utf-8 в cp1251, так как в utf-8 другие коды символов.
1 |
<? |
Получилось не намного короче, зато более логично. Мы же всё таки программированием занимаемся. В итоге наш код будет выглядеть так:
1 |
<body>
|
В браузере же это выглядит вот так:
На сегодня всё, теперь вы легко можете посчитать количество символов на PHP. Если всё-таки у вас остались вопросы – не стесняйтесь, задавайте в комментариях, отвечу всем.
Успехов вам и до новых встреч!
Читайте также похожие статьи:
Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.