Замена кавычек (") на "елочки" («) в тексте с тегами

A
На сайте с 06.07.2009
Offline
33
20605

Вопрос к знатокам: как заменить кавычки (") на "елочки" («) в строке текста, который содержит теги внутри которых есть кавычки.

Например: текст "текст" текст <a href="текст" class="текст">"текст"</a>

Надо: текст «текст» текст <a href="текст" class="текст">«текст»</a>

addvert добавил 18.07.2009 в 17:52

Делал: $str = ereg_replace(" \"", " &laquo;", $str);

$str = ereg_replace("\" ", "&raquo; ", $str);

$str = ereg_replace("\",", "&raquo;,", $str);

$str = ereg_replace("\"\.", "&raquo;.", $str);

Однако с тегами проблема внутри они тоже заменяются.

K
На сайте с 12.07.2006
Offline
295
Kpd
#1

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

Поэтому можно попробовать что-то типа

preg_replace ("#\s+\"([^\"]+)\"#", " &raquo;\\1&raquo;", $str);

P.S. Регулярку не проверял, по логике где-то так, мелочи сами подправьте.

P.P.S А ещё лучше так

preg_replace ("#([^=])\"([^\"]+)\"#", "\\1&raquo;\\2&raquo;", $str);

A
На сайте с 06.07.2009
Offline
33
#2

Спасибо, работает!:)

K
На сайте с 12.07.2006
Offline
295
Kpd
#3
addvert:
Спасибо, работает!

Для полного счастья попробуйте разобраться как это работает. Знание регулярок ещё никому не мешало :)

[Удален]
#4

Оно работает, пока в тексте нет обработчиков js и свойства тегов пишутся в одинарных кавычках. Имхо правильнее всё-таки проверять в теге находится кавычка или вне его. Например такая ситуация не будет отрабатываться регуляркой выше правильно:

тывапывп <a href='#' onclick='alert("Превед");'>ывпаыв</a> ыкп 
A
На сайте с 06.07.2009
Offline
33
#5

Да, в этом случае не работает. А как регулярку написать для <"текст в кавычках">

addvert добавил 25.07.2009 в 01:11

bearman, спасибо Вам. Отличный вариант. а то с регуляркой действительно замучился.

Замена кавычек на елочки в html по bearman'у:


<?
$text = '<a href="текст" class="текст">"текст"</a>

<p>еще какие то "кавычки "</p>';
$text = preg_replace_callback("#>(.*?)<#sm",'replace_quotes',$text);

die($text);

function replace_quotes($m)
{
$m = $m[1];
$m = preg_replace('#"(\S)#','&laquo;$1',$m);
$m = preg_replace('#(\S\s*)"#','$1&raquo;',$m);

return '>'.$m."<";
}

Еще раз спасибо!

Polimer
На сайте с 01.09.2006
Offline
84
#6

Модифицированный вариант, часть регулярок заменена на строковые функции (в теории оно вроде как быстрее).

<?php

$text = '<a href="текст" class="текст">"текст"</a>

<p>еще какие то "кавычки "</p><b>""</b><b>"</b>';
$text = preg_replace_callback("#>(.*?)<#sm",'replace_quotes',$text);

die($text);

function replace_quotes($m)
{
$m = $m[1];
$pos = 0;
while (FALSE !== ($pos = strpos($m, '"', $pos))) {
$m = substr_replace($m,
(isset($m[$pos+1]) && ctype_graph($m[$pos+1]) || $pos == 0)
? '&laquo;'
: '&raquo;',
$pos, 1);
$pos += 6;
}
return '>'.$m."<";
}

Только теги руками вырезать ломает )

Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий