php5 пропарсить строку

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 6:49:25

Есть строка (почтовый адрес), которую нужно напечатать на конверте; если строка больше $strLen, то нужно ее разбить на подстроки которые сохраняются в массиве, причем разбивать нужно "по-словам". Можно ли perl-совместимым регулярным выражением из строки длиной $strLen "отрезать" с конца все до первого пробела?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: php5 пропарсить строку

Непрочитанное сообщение ProFTP » 2009-07-06 6:57:43

Demiurg писал(а): "отрезать" с конца все до первого пробела?
а че за email адресс, до первого пробела?

в приницпе можно определить какой номер символа в строке в первом пробеле (с права навреное?), потом substr отрезать до того сивола....
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

Re: php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 7:04:57

а че за email адресс
не E- , обычный почтовый адрес, хранящийся в БД, который нужно распечатать на обычном (за 50 коп.) конверте... :)
в приницпе можно определить какой номер символа
...такой алгоритм я уже "сочинил", но получился довольно громоздкий, с "кучей" циклов... ИМХО, можно сделать проще с помощью mb_ereg_* в одну строчку... голову уже часа 1.5 ломаю, пока не получается... :)

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: php5 пропарсить строку

Непрочитанное сообщение ProFTP » 2009-07-06 7:08:48

пробел справа или слева?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

Re: php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 7:11:20

справа (с конца) подстроки...

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: php5 пропарсить строку

Непрочитанное сообщение ProFTP » 2009-07-06 7:15:00

я бы сделал так, проще всего, еще можно групировку

Код: Выделить всё

@array = splite (/ /, $strLen);

unshift  @array; # удалить слова до первого пробела, с конца массива, на php есть unshift по-моиму

$strLen2 = join (/ /, @array);
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

Re: php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 7:45:30

в 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;
}
...пошел тестить. :) уже "кучу" баг нашел, поправил.

Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

Re: php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 8:41:29

Что-то я упустил:

Код: Выделить всё

%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 символов... ЧЯДНТ?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php5 пропарсить строку

Непрочитанное сообщение zg » 2009-07-06 9:44:23

Demiurg, ты в какой кодировке работаешь?

Demiurg
мл. сержант
Сообщения: 142
Зарегистрирован: 2008-03-13 22:16:57

Re: php5 пропарсить строку

Непрочитанное сообщение Demiurg » 2009-07-06 10:09:08

ты в какой кодировке работаешь?
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;
}
а что-нибудь короче/красивее этого придумать можно?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: php5 пропарсить строку

Непрочитанное сообщение zg » 2009-07-06 15:23:57

Demiurg писал(а):а что-нибудь короче/красивее этого придумать можно?
можно