Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подстветка текста в кавычках, подсветка кавычки 
:(
    Опции темы
Zipo
Дата 14.4.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 4.11.2003

Репутация: нет
Всего: 0



Господа, всегда интересовало, как можно регулярными врыражениями (или другим сопсобом) подсветить строку в кавычках. А сейчас вот сделать нужно.

Из
string contained 'parameter, with slashed\' and some more string' 11
Сделать это
string contained <span>'parameter, with slashed\' and some more string'</span> 11

Проблема кроется в кавычке, которая под слешом - \', как обойти такие моменты?

Код

    $str = <<<END
string contained 'parameter, with slashed\' and some more string';
<br>
string 2 contained 'parameter, with slashed\' and some more string';
END;

    $str =    preg_replace("|'(.+)'|iU", '<span>\'\\1\'</span>', $str);

    echo $str;

PM MAIL   Вверх
Canarat
Дата 14.4.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 11.3.2008
Где: Каспий

Репутация: 5
Всего: 5



код был кривой, извиняюсь

Вот так:
Код

<?php
    $str = <<<END
string contained 'parameter, with slashed\' and some more string\n';
These fuckink 'slashes' and their fucking 'slashed \'quotes\', dammit!'
END;
    $str =    preg_replace("|'(.*)([^\\\])'|iU", '<span>\'\\1\\2\'</span>', $str);
    echo $str;
?>


Это сообщение отредактировал(а) Canarat - 14.4.2008, 16:27
PM MAIL   Вверх
gta4kv
Дата 14.4.2008, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Canarat, не все так просто, если будет так:

Код

string contained 'parameter, with slashed\' and some more string\n';


то подсветка закончиться на with slashed\'
PM MAIL   Вверх
gta4kv
Дата 14.4.2008, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 21
Всего: 91



Да, к тому же:
1. кавычки тоже в спан захватываются
2. в первой строке и ";" выделяется.

Это сообщение отредактировал(а) gta4kv - 14.4.2008, 16:52
PM MAIL   Вверх
Canarat
Дата 14.4.2008, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 11.3.2008
Где: Каспий

Репутация: 5
Всего: 5



gta4kv, так в примере топикстартера он тоже апострОфы захватывает в спан
PM MAIL   Вверх
Zipo
Дата 15.4.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 4.11.2003

Репутация: нет
Всего: 0



Спасибо за вариант, проблемы у него есть как и написал gta4kv при появлении слеша
Например так:
Код

    $str = <<<END
string contained 'parameter, with slashed\' and some more string\n';
These fuckink 'slashes' and their fucking 'slashed \'quotes\', \n \' dammit!'
END;
    $str =    preg_replace("|'(.*)([^\\\])'|iU", '<span>\'\\1\\2\'</span>', $str);
    echo $str;



Есть конечно глупый вариант это заменить предварительно \' на что-то вроде ~!~ произвести подсветку, и потом обратно поменять ~!~ на \', но не думаю, что такой подход у производителей редакторов smile
PM MAIL   Вверх
Canarat
Дата 15.4.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 212
Регистрация: 11.3.2008
Где: Каспий

Репутация: 5
Всего: 5



О каких редакторах идет речь?

Вообще, если горит - тут проще использовать метод конечных автоматов:
Код

<?php
$str = <<<END
string contained 'parameter, with slashed\' and some more string\n';
These fuckink 'slashes' and their fucking 'slashed \'quotes\', \n \' dammit!' asdasdasd
END;
$length = strlen($str) - 1;
$state = 1;
$result = "";
$q_bef = "<span>";
$q_aft = "</span>";
for ($i = 0; $i <= $length; $i++)
{
  $s = $str[$i];
  $pr = $str[$i - 1];
  if ($s == "'")
  {
    if ($state == 1)
    {
      $state = 2;
      $result .= $q_bef . "'";
    }
    elseif ($pr != "\\")
    {
      $state = 1;
      $result .= "'" . $q_aft;
    }
    else
      $result .= $s;
  }
  else
    $result .= $s;
}
echo $result;
?>


Если регулярными выражениями не получается. Но такая громоздкая функция для достаточно простой операции не рекомендуется
PM MAIL   Вверх
webevt
Дата 15.4.2008, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 5.5.2005

Репутация: нет
Всего: 3



Не вчитывался в тему, но по-моему вам подойдет preg_quote(). Ненужная кавычка заэкранируется и не будет учитываться регуляркой..
PM MAIL   Вверх
flashaa
Дата 15.4.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 796
Регистрация: 7.3.2006

Репутация: 19
Всего: 25



webevt, preg_quote по смыслу тут не подойдет.
PM MAIL   Вверх
ksnk
Дата 15.4.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

    $str = <<<END
string contained 'parameter, with slashed\' and some more string';
<br>
string 2 contained 'parameter, with slashed\' and some more string';
END;
    $str =    preg_replace('/(["\'])([^\\1\\\\]|\\\\.)*?\\1/s', '<font color=red>\\0</font>', $str);
    echo $str;



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
sTa1kEr
Дата 15.4.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Не столько сложная, сколько запутанная регулярка получается (из-за экранирования экранирующих символов)
Код

preg_replace("/(?<!\\\\)'([^']|\\')+(?<!\\\\)'/iU", '<span>\\0</span>', $str);


Добавлено через 4 минуты и 17 секунд
ksnk, вариант с обратными ссылками хороший. Единственное вы не учли что может сначала встретится экранирующая кавычка.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.