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

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

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

 

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

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

тема: Как получить текст до и внутри тэга?
 
 автор: Xenos   (12.08.2006 в 17:03)   письмо автору
 
 

Можно ли задать вопрос: где я допустил ошибку, при получении текста, что стоит до тэга [log] и внутри их? Вроде писал так, чтобы в результирующем массиве получить текст + фрагмент [log]...[/log]. А оно срабатывает только если тэга будет два. В иных случаях -выдает непонятно что....


<?
$logs
='
Один
[log]...[/log]

Два
[log]...[/log]
Три[log]...[/log]

Четыре
[log]...[/log]
'
;

preg_match(
"/([^\[log\]][\s\S]*)(?=\[log\])"// любой текст, кроме [log], до первого [log]
"(\[log\][\s\S]*[^\[\/log\]]\[\/log\])/" // лог, в тэгах [log]...[/log]
$logs$part_log);
echo 
'<pre>'print_r($part_log); echo '</pre>';
?>

   
 
 автор: Xenos   (12.08.2006 в 23:37)   письмо автору
 
   для: Xenos   (12.08.2006 в 17:03)
 

как оказалось: найти решение этому вопросу не сложно. сложнее стало, когда я сделал:
$logs='
Один
[log] [...] [/log]

Два
[log] [...] [/log]
Три[log] [...] [/log]

Четыре
[log] [...] [/log]
';


Т.о. если я мог в патерне написать, до этого: .... ([^\[]*), то теперь это не получается и выдает пустые массивы... В итоге прошу помощи, если это возможно, в текущей ситуации. Скрипт выглядит, сейчас так:


<?
$logs
='
Один
[log] [...] [/log]

Два
[log] [...] [/log]
Три[log] [...] [/log]

Четыре
[log] [...] [/log]
'
;

preg_match_all(
"/([^\[log\]]*)(?=\[log\])"// любой текст, кроме [log], до первого [log]
"(\[log\][^\[\/log\]]*\[\/log\])/" // лог, в тэгах [log]...[/log]
$logs$part_log);
unset(
$part_log[0]);
echo 
'<pre>'print_r($part_log); echo '</pre>';
?>

   
 
 автор: Xenos   (13.08.2006 в 21:21)   письмо автору
 
   для: Xenos   (12.08.2006 в 17:03)
 

Ап..

и уточнение, что может быть [log] [...] [/log], а может и [log] []... [/log] и как угодно...

   
 
 автор: Xenos   (14.08.2006 в 12:46)   письмо автору
 
   для: Xenos   (13.08.2006 в 21:21)
 

Мдям-с... понедельник) тишина... я сообразил, как отфильтровать все, что до / идет... а как именно полностью слово [/log]...

И я могу надеяться на ответ? :)

   
 
 автор: cheops   (14.08.2006 в 16:52)   письмо автору
 
   для: Xenos   (13.08.2006 в 21:21)
 

Используйте регулярное выражение вида
"/(\[log\](.*?)\[\/log\])/"

конструкция .*? - будет выбирать минимальное число символов в которых не будет [/log]

   
 
 автор: Vitas   (14.08.2006 в 18:19)   письмо автору
 
   для: cheops   (14.08.2006 в 16:52)
 

<?php

preg_match 
("@((.*?)\[log\](.*?)\[/log\])*@"$text$matches);

?>

Так вроде

   
 
 автор: Xenos   (16.08.2006 в 19:02)   письмо автору
 
   для: Vitas   (14.08.2006 в 18:19)
 

конструкция с точкой, к сожеланию, не сработает, если будет новая строчка до тэга. (
поэтому выкручивался иначе

   
 
 автор: cheops   (16.08.2006 в 22:32)   письмо автору
 
   для: Xenos   (16.08.2006 в 19:02)
 

Добавьте модификатор s - он позволяет обойти ограничения новой строчки.

   
Rambler's Top100
вверх

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