Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Разбить строку
 
 автор: vadimka   (14.10.2010 в 13:04)   письмо автору
 
 

Здравствуйте! нужно разбить текст в массив по разделителю: (абзац СЛОВО с буквами в верхнем регистре абзац) При это начало текста без разделителя:

$text="Такой текст. что то написано.

ТЕМА
это идет тема.

СРОКИ
идут условия по срокам.

и т.п."

в итоге должно быть:
1 Такой текст. что то написано.
2 ТЕМА
это идет тема.
3 СРОКИ
идут условия по срокам.


не могу никак написать регулярку:

$arr=(preg_split('#.*?([\r\n])+[A-ZА-ЯЁ\/][\r\n].*?#',$text));
  echo "<pre>";
  print_r($arr);
  echo "</pre>";

  Ответить  
 
 автор: Trianon   (14.10.2010 в 13:18)   письмо автору
 
   для: vadimka   (14.10.2010 в 13:04)
 

Просто нужно добавить отсутствующий заголовок.

  Ответить  
 
 автор: vadimka   (14.10.2010 в 16:33)   письмо автору
 
   для: Trianon   (14.10.2010 в 13:18)
 

не знаю как прицепить "или" прошу как то намекнуть:)

  Ответить  
 
 автор: heed   (14.10.2010 в 16:24)   письмо автору
 
   для: vadimka   (14.10.2010 в 13:04)
 

>ТЕМА
это идет тема.

СРОКИ
идут условия по срокам.


похоже на preg_split('#^([A-ZА-ЯЁ][u]+[/u])$#m', ....., PREG_SPLIT_DELIM_CAPTURE
или preg_split('#^(?=[A-ZА-ЯЁ]+$)#m', ..........

но под словами
>Просто нужно добавить отсутствующий заголовок.
,если правильно понял, имелось ввиду то что таким разделением ограничивается возможность присутствия в тексте просто строк из заглавных букв

  Ответить  
 
 автор: Trianon   (14.10.2010 в 16:29)   письмо автору
 
   для: heed   (14.10.2010 в 16:24)
 

>но под словами
>>Просто нужно добавить отсутствующий заголовок.
>,если правильно понял, имелось ввиду то что таким разделением ограничивается возможность присутствия в тексте просто строк из заглавных букв

нет - это ограничение предполагалось автором изначально.
имелся в виду легкий способ вернуть данным некий минимально регулярный вид.
Так чтоб первый фрагмент произвольного текста синтаксически не отличался от остальных.
Конечно, способ несколько костыльный... Так ведь и исходная постановка задачи красотой не блещет, очень мягко выражаясь.

  Ответить  
 
 автор: heed   (14.10.2010 в 17:09)   письмо автору
35.5 Кб
 
   для: Trianon   (14.10.2010 в 16:29)
 

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

задумка была в том что предварительно скриптом в файлы записывается первая строка
en<196-86>ru<310-88>cs<428-92>de<553-120>es<709-94> ....
с указанием оффсетов и размеров в файле и по ErrorDocument 400 error.php?400 .... считывать только нужное.
но там ещё более строгая форма записи (для индексирующего скрипта) и слишком много if в обработчике.

  Ответить  
 
 автор: vadimka   (14.10.2010 в 16:42)   письмо автору
 
   для: heed   (14.10.2010 в 16:24)
 

Не могли бы объяснить
?=

  Ответить  
 
 автор: heed   (14.10.2010 в 17:13)   письмо автору
 
   для: vadimka   (14.10.2010 в 16:42)
 

из php-мануала/reference.pcre.pattern.syntax.html

Сопоставление подмаски, содержащий утверждение, происходит обычным образом, за исключением того, что текущая позиция не изменяется. Утверждения касательно последующего текста начинаются с (?= для положительных утверждений и с (?! для отрицающих утверждений. Например, \w+(?=;) совпадает со словом, за которым следует символ ';', но при этом сама точка с запятой в совпадение не включается. А foo(?!bar) соответствует любому появлению "foo", после которого не идёт "bar".

  Ответить  
 
 автор: vadimka   (14.10.2010 в 17:23)   письмо автору
 
   для: heed   (14.10.2010 в 17:13)
 

спасибо!

  Ответить  
 
 автор: vadimka   (14.10.2010 в 17:31)   письмо автору
 
   для: vadimka   (14.10.2010 в 17:23)
 

Я решил всех и себя запутать - упрошаем задачу:
$text="
НАЧАЛО
и какой-то текст.

ТЕМА
это идет тема.

СРОКИ ЗАКАЗА
идут условия по срокам.

НАЗВАНИЕ/СО/СЛЕШЕМ
снова текст.
"
$arr=(preg_split('#(^|[\r\n]+)[А-ЯЁ\s\/]+[\r\n]+.*?#',$text,-1, PREG_SPLIT_NO_EMPTY ));
мне так разбивает но при этом "съедает" слова с буквами в верхнем регистре.
PREG_SPLIT_DELIM_CAPTURE - чето не меняет ситуацию

  Ответить  
 
 автор: Trianon   (14.10.2010 в 17:48)   письмо автору
 
   для: vadimka   (14.10.2010 в 17:31)
 

а зачем Вам preg_split?
чем preg_match_all не угодил?

  Ответить  
 
 автор: vadimka   (15.10.2010 в 10:51)   письмо автору
 
   для: Trianon   (14.10.2010 в 17:48)
 

Да, наверно, нужен preg_match_all, это я зарапортовался, заодно, что-то новое узнал:)

  Ответить  
 
 автор: heed   (14.10.2010 в 18:09)   письмо автору
 
   для: vadimka   (14.10.2010 в 17:31)
 

кстати да :) PREG_SPLIT_NO_EMPTY может всё испортить

PREG_SPLIT_DELIM_CAPTURE имеет смысл только если в () что-то есть
<?php
header
('content-type: text/plain'); 

$text="НАЧАЛО
и какой-то текст. 

ТЕМА
это идет тема. 

СРОКИ ЗАКАЗА
идут условия по срокам. 

НАЗВАНИЕ/СО/СЛЕШЕМ
снова текст. 
"
;

#\A - начало данных (независимо от многострочного режима)
#/m - метасимвол начала строки '^' соответствует ..... '$' ..... перед переводом строки

var_dump(preg_split('#(?:\A|^\r?\n)[А-ЯЁ\/]+\r?\n#m'$text,-11));
?>
--------------------------------------
<?php
var_dump
(preg_split('#(?:\A|^\r?\n)([А-ЯЁ\/]+)\r?\n#m'$text, -11+PREG_SPLIT_DELIM_CAPTURE));
// пробел не добавлял
?>

читайте softtime.ru/bookphp/help.php
// после копирования со страниц удаляйте добавленные форумом пробелы после строк в [CODE]
//// или браузер добавляет
////// \r?\n$ была опечатка после переделывания \r?$ на \r?\n

  Ответить  
 
 автор: vadimka   (15.10.2010 в 10:50)   письмо автору
 
   для: heed   (14.10.2010 в 18:09)
 

работает, но надо время, чтобы понять как.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования