Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Вопросик по регулярным выражениям. В пхп:)   Найти похожие ветки 

 
antonn ©   (2007-04-29 22:50) [0]

уже начал почитывать про регулярные выражения, но понял, что для решения одной заковырки изучать кучу нового материала как то не очень... Есть у меня строка, в ней между тегами [h][/h] находится текст (точнее просто набор букв:)), и мне нужно убрать в этих буквах пробелы. Т.е. вместо [h]f f[/h] получить [h]ff[/h]. Примерно так же хочу и ссылки позже в тегах обрамлять. Но вот с пробелами никак не справлюсь. Теги то я выделяю и их содержимое тоже, а как в них удалить пробелы - не пойму...
$ddd="[d] d d[/d]";
$ddd=eregi_replace("\\[d\\]?(.*)\\[/d\\]?", "|\\1|", $ddd); //палочки просто вместо тегов, чтоб границы видеть

если бы в строке был бы только один блок тегов, я бы сделал, но их может быть много:( В общем, подскажите, пожалуйста, как такое написать (и можно ли вообще).
Я вообще верхнуюю штуку правильно написал? :)


 
ferr ©   (2007-04-29 22:56) [1]

что-то мне не понятно что у вас там понаписано.
надо заменять "\s+" на "" и всё. + сначала вытащить кусок в котором заменять..


 
antonn ©   (2007-04-29 22:59) [2]

ну в общем условие такое получается - удалить все пробелы в тексте обрамленного тегами [h] и [/h]. Пример выше я соорудил методом копипаста и научного тыка и он только находит текст м/у тегами:)


 
McSimm ©   (2007-04-29 23:31) [3]


> если бы в строке был бы только один блок тегов, я бы сделал,
>  но их может быть много:

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

Позволю себе дать совет - раз уж все равно с кучей материала придется знакомиться, лучше сразу забыть про ereg и использовать только preg. Они лучше во всех отношених.


 
Zeqfreed ©   (2007-04-29 23:43) [4]

<?php
   function strip_spaces($a, $b, $c) {
       return $a . str_replace(" ", "", $b) . $c;
   }

   $a = "hello[h]this   text contains few spaces[/h]here the spaces   are [/h]  again";
   $b = preg_replace("/(\[h\])(.*)(\[\/h\])/ie", "strip_spaces("$1", "$2", "$3")", $a);
   
   print "$a = " . $a . "<br/>\n";
   print "$b = " . $b . "<br/>\n";
?>


 
antonn ©   (2007-04-29 23:50) [5]

McSimm, да я так и понял, что preg интересней...
Zeqfreed, Спасибо!

я немного накопипастил, похоже на правду?
function callback($data){
 $data[0]=preg_replace("/(\s)/","",$data[0]);
 return $data[0];
}
$ddd=preg_replace_callback("#\[h\](.*?)\[/h\]#si", "callback", $ddd);


 
Zeqfreed ©   (2007-04-30 00:27) [6]

Не знаю зачем столько сложностей :) Ну если работает, то похоже ;)


 
antonn ©   (2007-04-30 14:41) [7]

кстати говоря, код в [4] все таки рубает пробелы и между блоками тегов... придется поверить в правильность своего кода и его использовать (честно - сам не пойму, как оно работает:)), он хоть не рубает вне тегов...


 
McSimm ©   (2007-04-30 14:59) [8]


> все таки рубает пробелы и между блоками тегов


* по умолчанию работает в жадном режиме, чтобы выключить, надо использовать (.*?)


 
antonn ©   (2007-04-30 15:02) [9]

хм... чувствую себя балбесом:)


 
McSimm ©   (2007-04-30 15:10) [10]

это просто.
в строке "AbcAdeA" шаблон /A(.*)A/ захватит строку целиком, т.е. "жадно", вопросительный знак после квантификатора выключает жадность, т.е. (.*?) захватит "AbcA"


 
antonn ©   (2007-04-30 15:16) [11]

ну да, это я уже понял:)
кстати, где то видел ссылку в тегах [img][/img], которая скушала последний блок... тут подсветка по словам идет? можно проверять, есть ли в слове "[img" и не подсвечивать, тогда  и тег заработает:) Примерно для этих целей нужно было избавиться от пробелов, чтобы [img] и [/img] попали в одно слово со ссылкой...



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.045 c
2-1178548742
Regent
2007-05-07 18:39
2007.05.27
Диалог


15-1177498566
SerJaNT
2007-04-25 14:56
2007.05.27
Протестировать сайт


15-1177485819
TCrash
2007-04-25 11:23
2007.05.27
документация по MS VisualStudio 7


15-1177959188
Riply
2007-04-30 22:53
2007.05.27
Проверка дискеты на наличие плохих блоков.


15-1177676806
I-New
2007-04-27 16:26
2007.05.27
Есть GDI+ в Висте?