Страница 1 из 1
php5 пропарсить строку
Добавлено: 2009-07-06 6:49:25
Demiurg
Есть строка (почтовый адрес), которую нужно напечатать на конверте; если строка больше $strLen, то нужно ее разбить на подстроки которые сохраняются в массиве, причем разбивать нужно "по-словам". Можно ли perl-совместимым регулярным выражением из строки длиной $strLen "отрезать" с конца все до первого пробела?
Re: php5 пропарсить строку
Добавлено: 2009-07-06 6:57:43
ProFTP
Demiurg писал(а): "отрезать" с конца все до первого пробела?
а че за email адресс, до первого пробела?
в приницпе можно определить какой номер символа в строке в первом пробеле (с права навреное?), потом substr отрезать до того сивола....
Re: php5 пропарсить строку
Добавлено: 2009-07-06 7:04:57
Demiurg
а че за email адресс
не E- , обычный почтовый адрес, хранящийся в БД, который нужно распечатать на обычном (за 50 коп.) конверте...
в приницпе можно определить какой номер символа
...такой алгоритм я уже "сочинил", но получился довольно громоздкий, с "кучей" циклов... ИМХО, можно сделать проще с помощью
mb_ereg_* в одну строчку... голову уже часа 1.5 ломаю, пока не получается...

Re: php5 пропарсить строку
Добавлено: 2009-07-06 7:08:48
ProFTP
пробел справа или слева?
Re: php5 пропарсить строку
Добавлено: 2009-07-06 7:11:20
Demiurg
справа (с конца) подстроки...
Re: php5 пропарсить строку
Добавлено: 2009-07-06 7:15:00
ProFTP
я бы сделал так, проще всего, еще можно групировку
Код: Выделить всё
@array = splite (/ /, $strLen);
unshift @array; # удалить слова до первого пробела, с конца массива, на php есть unshift по-моиму
$strLen2 = join (/ /, @array);
Re: php5 пропарсить строку
Добавлено: 2009-07-06 7:45:30
Demiurg
в perl я не особо силен, но мысль понял. В php я пока это вижу так:
Код: Выделить всё
/**
Метод 'Разбить строку по словам на подстроки не больше заданной длины'
@param $str исходная строка
*/
public function mb_str2arr($str){
$j = 0;
if(mb_strlen($str) > $this->strLen)
while(mb_strlen($str) >= $this->strLen){
$tempStr = mb_substr($str,0,50);
$tempArrStr = mb_split(" ",$tempStr);
array_pop($tempArrStr);
$tempStr = implode(" ",$tempArrStr);
$retArr[$j] = $tempStr;
$str = mb_substr($str,mb_strlen($tempStr));
$j++;
}
$retArr[$j] = $str; // записываем оставшуюся подстроку < $this->strLen
return $retArr;
}
...пошел тестить.

уже "кучу" баг нашел, поправил.
Re: php5 пропарсить строку
Добавлено: 2009-07-06 8:41:29
Demiurg
Что-то я упустил:
Код: Выделить всё
%cat index.php
<?php
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")."GMT");
header("Content-type: text/html; charset=UTF-8");
function __autoload($class_name){
require_once 'inc/'.$class_name.'.php';
}
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Account of correspondence</title>
</head>
<body>';
$where = "г. Москва, Биржевая площадь, д.1, Федеральная служба по труду и занятости, Руководителю.";
$str = new String();
$arrStr = $str->mb_str2arr($where);
for($i = 0; $i < count($arrStr); $i++)
echo "<p>$i - ",$arrStr[$i],"</p>";
echo '</body></html>';
?>
Код: Выделить всё
%cat inc/String.php
<?php class String {
protected $strLen;
public function __construct($strLen = 50){
$this->setStrLen($strLen);
}
public function __destruct(){
}
/**
Метод 'Разбить строку по словам на подстроки не больше заданной длины'
@param $str исходная строка
*/
public function mb_str2arr($str){
$j = 0;
if(mb_strlen($str) > $this->strLen)
while(mb_strlen($str) > $this->strLen){
$tempStr = mb_substr($str,0,$this->strLen);
$tempArrStr = mb_split(" ",$tempStr);
array_pop($tempArrStr);
$tempStr = implode(" ",$tempArrStr);
$retArr[$j] = $tempStr;
$str = mb_substr($str,mb_strlen($tempStr));
$j++;
}
$retArr[$j] = $str; // записываем оставшуюся подстроку < $this->strLen
return $retArr;
}
public function setStrLen($strLen){
$this->strLen = $strLen;
}
} ?>
если инициализировать
String со значением 50, то печатет:
Код: Выделить всё
0 - г. Москва, Биржевая
1 - площадь, д.1, Федеральная
2 - служба по труду и
3 - занятости, Руководителю.
если со значением 100, то:
Код: Выделить всё
0 - г. Москва, Биржевая площадь, д.1, Федеральная служба по
1 - труду и занятости, Руководителю.
ни то, ни другое не верно... в первом случае строка слишком короткая, во втором длиньше пятидесяти на 5 символов... ЧЯДНТ?
Re: php5 пропарсить строку
Добавлено: 2009-07-06 9:44:23
zg
Demiurg, ты в какой кодировке работаешь?
Re: php5 пропарсить строку
Добавлено: 2009-07-06 10:09:08
Demiurg
ты в какой кодировке работаешь?
UTF8... уже разобрался:
Код: Выделить всё
public function mb_str2arr($str){
$j = 0;
if(mb_strlen($str,"UTF-8") > $this->strLen)
while(mb_strlen($str,"UTF-8") > $this->strLen){
$tempStr = mb_substr($str,0,$this->strLen,"UTF-8");
$tempArrStr = mb_split(" ",$tempStr);
array_pop($tempArrStr);
$tempStr = implode(" ",$tempArrStr);
$retArr[$j] = $tempStr;
$str = mb_substr($str,mb_strlen($tempStr));
$j++;
}
$retArr[$j] = $str; // записываем оставшуюся подстроку < $this->strLen
return $retArr;
}
а что-нибудь короче/красивее этого придумать можно?
Re: php5 пропарсить строку
Добавлено: 2009-07-06 15:23:57
zg
Demiurg писал(а):а что-нибудь короче/красивее этого придумать можно?
можно