|
|
|
|
|
для: Хулиган
(09.12.2007 в 09:51)
| | >> preg_quote экранирует не только скобки, но и кучу других символов.
Всё правильно, иначе работать не будет.
>> Плюс увеличивает длину выделяемого фрагмента текста
А Вы ее посчитайте перед применением preg_quote()
>> Вариант с preg_replace вообще ничего не выделяет, если в фрагменте есть скобки.
Хм.. да, второй вариант (который закомментирован) подойдет только для слов без кавычек, скобок и всего прочего. Первый работает.
str_ireplace() не используете потому что она "(PHP 5)" ? | |
|
|
|
|
|
|
|
для: kasmanaft
(09.12.2007 в 09:15)
| | preg_quote экранирует не только скобки, но и кучу других символов. Плюс увеличивает длину выделяемого фрагмента текста, и нужно подсчитывать количество спецсимволов в строке поиска и на эту величину уменьшать длину выделяемого фрагмента.
Вариант с preg_replace вообще ничего не выделяет, если в фрагменте есть скобки.
Видимо надо просто заблокировать ввод спецсимволов в поле поиска и не мучаться. | |
|
|
|
|
|
|
|
для: Хулиган
(08.12.2007 в 13:20)
| | Используйте лучше preg_replace
<?php
setlocale (LC_ALL, array ('ru_RU.CP1251', 'rus_RUS.1251'));
$text = 'Проблема в том, что если искать в тексте фрагменты, в которых есть
скобки "(" и ")", то возникают ошибки.
Например есть такой текст: "это (слово) в скобках".
Ищем "слово". Результат: "это (слово) в скобках". Всё выделено правильно.
Ищем "(слово)". Результат: "это (слово)) в [скобках]". Откуда-то взялась ещё одна
закрывающая скобка, а открывающая не выделилась.
Ищем "(слово". Результат вообще плачевный: никакого вывода не происходит, только
пишет такое:';
$match = "(слово)";
echo preg_replace("[".preg_quote($match)."]i", "<b>\\0</b>", $text);
// или же, если не надо искать части слов:
//echo preg_replace("[\b".preg_quote($match)."\b]i", "<b>\\0</b>", $text);
?>
|
| |
|
|
|
|
|
|
|
для: Хулиган
(08.12.2007 в 18:44)
| | string preg_quote ( string str [, string delimiter] )
Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.
В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. | |
|
|
|
|
|
|
|
для: elenaki
(08.12.2007 в 16:17)
| | ну тогда будем отсеивать маньяков :) Путем запрета на ввод скобок. | |
|
|
|
|
|
|
|
для: Хулиган
(08.12.2007 в 16:03)
| | кто же в поиске ищет со скобками? маньяки только... | |
|
|
|
|
|
|
|
для: sim5
(08.12.2007 в 13:39)
| | Никакой функции, которая позволяла бы сделать escape, я в php не нашёл.
Механическая замена скобок на %28 и %29 при помощи str_replace ничего не даёт - слова перестают выделяться. | |
|
|
|
|
|
|
|
для: Хулиган
(08.12.2007 в 13:20)
| | spliti - (string pattern, string string [, int limit])
Обратите, пожалуйста, внимание, что pattern это регулярное выражение. Если вы хотите разделить на любом из символов, имеющих в регулярных выражениях специальное значение, вам нужно сначала мнемонизировать/escape эти символы.
Видимо в этом. | |
|
|
|
|
|
|
| Сделал поиск, вернее выделение жирным шрифтом результатов поиска:
setlocale (LC_ALL, array ('ru_RU.CP1251', 'rus_RUS.1251'));
$len = strlen($match); $start = 0;
$arr = spliti($match, $text);
foreach ($arr as $value) {
$start += strlen($value);
print $value."<b>".substr($text, $start, $len)."</b>";
$start += $len;
}
|
Проблема в том, что если искать в тексте фрагменты, в которых есть скобки "(" и ")", то возникают ошибки.
Например есть такой текст: "это (слово) в скобках".
Ищем "слово". Результат: "это (слово) в скобках". Всё выделено правильно.
Ищем "(слово)". Результат: "это (слово)) в скобках". Откуда-то взялась ещё одна закрывающая скобка, а открывающая не выделилась.
Ищем "(слово". Результат вообще плачевный: никакого вывода не происходит, только пишет такое:
Warning: spliti() [function.spliti]: REG_EPAREN in z:\home\site.ru\www\quest.php on line 106
Warning: Invalid argument supplied for foreach() in z:\home\site.ru\www\quest.php on line 107
В справочнике по php не нашёл, что означает REG_EPAREN.
В чём тут ошибка? | |
|
|
|
|