Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Поиск тега в тексте внутри другого тега
Форумы портала PHP.SU » PHP » Регулярные выражения » Поиск тега в тексте внутри другого тега

Страниц (1): [1]
 

1. Skeptik - 10 Октября, 2011 - 01:21:22 - перейти к сообщению
Есть текст, типа:

Цитата:
<span class="h4">
бла-бла-бла<br />
</span>&nbsp;<br />
<br />
<span class="h5">бла-бла-бла.<br />
&nbsp;<br />
бла-бла-бла<br />
</span>&nbsp;<br />
<br />
<span>бла-бла-бла.<br />
&nbsp;<br />
бла-бла-бла<br />
</span>&nbsp;<br />
<br />


Нужно все теги <br />, которые не вписаны внутрь тега span, заменить на <p></p>, при этом чтобы теги <br />, находящиеся внутри тега span, остались без изменений. Можно ли это реализовать через preg_replace? Помогите, плз, составить регулярное выражение.
2. LIME - 10 Октября, 2011 - 01:39:11 - перейти к сообщению
чета я думал думал как попроще
так и непридумал
может ктото умнее окажется
я вот что предлагаю
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $str='<br /><span class="h4">
  3. бла-бла-бла</span>&nbsp;<span class="h5">бла-бла-бла.&nbsp;бла-бла-бла</span>&nbsp;<span>бла-бла-бла.&nbsp;бла-бла-бла</span>&nbsp;<br />';
  4. echo preg_replace_callback('#(^.*<span)|(</span>.*<span)|(</span>.*$)#sU',create_function(
  5.               '$matches',
  6.               'return str_replace("<br />","<p></p>",$matches[0]);'
  7.           ),$str);
  8. ?>

(Добавление)
какая-то длинная регулярка получилась
и ведь не уменьшишь ))
подстрекаю
(Добавление)
я добавил в начало строки br
если его там точно быть не может хорошо бы убрать этот вариант из регулярки
3. LIME - 10 Октября, 2011 - 04:45:48 - перейти к сообщению
и с вложенными span могут быть проблемы хотя их наверное и быть не должно
4. Skeptik - 10 Октября, 2011 - 09:22:28 - перейти к сообщению
Спасибо за отклик! Улыбка
К сожалению, проблема в предложенном варианте - если встречается текст, где нет span вообще, то тег br не меняется. У меня была мысль, сделать в 2 прохода. Сначала:
Цитата:
$text = str_replace("<br />","<p></p>", $text);

А потом уже в получившемся сделать обратную замену внутри span - что-то вроде:
Цитата:
$text = preg_replace("регулярка внутри span", "<br />", $text);

Только не знаю, будет ли такой вариант оптимальным, ну, и составить регулярку пока не получилось.
5. LIME - 10 Октября, 2011 - 15:10:12 - перейти к сообщению
Skeptik ну раз нет изящнее решения
сначала строку проверяешь на наличие "<span" строковой фцией strpos
если нет такого тупо все меняешь
если есть применяешь метод выше
6. Alek - 20 Октября, 2011 - 22:15:30 - перейти к сообщению
Skeptik пишет:


Нужно все теги <br />, которые не вписаны внутрь тега span, заменить на <p></p>, при этом чтобы теги <br />, находящиеся внутри тега span, остались без изменений. Можно ли это реализовать через preg_replace? Помогите, плз, составить регулярное выражение.



PHP:
скопировать код в буфер обмена
  1. $str='<span class="h4">
  2. бла-бла-бла</span>&nbsp;<span class="h5">бла-бла-бла.&nbsp;бла-бла-бла</span>&nbsp;<span>бла-бла-бла.&nbsp;бла-бла-бла</span>&nbsp;<br />';
  3. $s=preg_replace('/(<\/span>\s)(?><br\s?\/>\s+){1,2}/ei',"'\\1'.'<p></p>'", $str);

 

Powered by ExBB FM 1.0 RC1