[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярное выражение
azait
В общем, что нужно:

чтобы везде по тексту повторяющиеся пробелы менялись на 1 пробел, за исключением того, что содержится в определенном теге (внутри тега могут находиться еще и другие теги),

например:

<p>text text text text text</p> - здесь пробелы заменяются
<no><p>text text text text text</p></no> - здесь все остается, как есть



Спустя 19 минут, 41 секунда (4.10.2010 - 17:06) DedMorozzz написал(а):
<?php

$a ="<p>text text text text text</p> - здесь пробелы заменяются <no><p>test test test test test</p></no> <p>text text text text text</p>";
$a=preg_replace_callback('#(.*?)(<no>.*?</no>)(.*)#',create_function('$matches','
$a=preg_replace(
\'# #\',\'\',$matches[1]);
$a .= $matches[2];
$a .= preg_replace(
\'# #\',\'\',$matches[3]);
return $a;
'
),$a);
echo $a;
?>

Спустя 2 часа, 13 минут, 5 секунд (4.10.2010 - 19:19) arvitaly написал(а):
дед мороз у тебя заменяются все пробелы а надо только повторяющиеся

Спустя 21 час, 56 минут, 33 секунды (5.10.2010 - 17:16) azait написал(а):
в приведенном примере не работает, если в тексте будет несколько блоков <no></no>

обрабатывается только первый

проблема актуальна...

Спустя 21 минута, 43 секунды (5.10.2010 - 17:38) DedMorozzz написал(а):
Цитата (arvitaly @ 4.10.2010 - 18:19)
дед мороз у тебя заменяются все пробелы а надо только повторяющиеся

ну это решаеться 1м действием smile.gif

А что касаемо многих тегов - тут уже разбивай на массивы, каждый элемент массива обрабатывай, далее конкатенируй.
Или же сперва узнать кол-во тегов, в которых нету обработки и поставить это кол-во в повторение шаблона + последний остаточный.
Если не понял как - напишу.

Спустя 24 минуты, 6 секунд (5.10.2010 - 18:02) arvitaly написал(а):
<?php
$str = " 11 1111<no>222 2222</no>3333 33<no> 3</no>44444 44 ";
$symbol = " ";
$tag = "no";
$i = -1;
$oldi = 0;
$dstr = preg_split("~(" . $symbol . "+)~", $str, 0, PREG_SPLIT_DELIM_CAPTURE);
$newstr = '';
for ($i = 0; $i < count($dstr)-1; $i++)
{
$newstr .= $dstr[$i];
if ( preg_match("~^(?:(?:(?!<" . $tag . ">).)*<" . $tag . ">(?:(?!<" . $tag . "></" . $tag . ">).)*</" . $tag . ">(?:(?!<" . $tag . "></" . $tag . ">).)*|(?:(?!<" . $tag . ">).)*)$~Usi", $dstr[$i]))
{
$newstr .= $symbol;
}
else
{
$newstr .= $dstr[$i+1];
}
$i++;
}
echo $newstr;
?>


Вместо смайлов - двоеточие скобка

Цитата
ну это решаеться 1м действием


Согласен, но когда проверяешь сначала запускаешь смотришь работает или нет, а потом уже если работает - смотришь код

Спустя 13 часов, 45 минут, 25 секунд (6.10.2010 - 07:47) azait написал(а):
огромное спасибо - очень помогли
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.