Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проблемы с функцией spliti - Warning: spliti() [function.spliti]: REG_EPAREN in

Сообщения:  [1-9] 

 
 автор: kasmanaft   (09.12.2007 в 15:58)   письмо автору
 
   для: Хулиган   (09.12.2007 в 09:51)
 

>> preg_quote экранирует не только скобки, но и кучу других символов.
Всё правильно, иначе работать не будет.

>> Плюс увеличивает длину выделяемого фрагмента текста
А Вы ее посчитайте перед применением preg_quote()

>> Вариант с preg_replace вообще ничего не выделяет, если в фрагменте есть скобки.
Хм.. да, второй вариант (который закомментирован) подойдет только для слов без кавычек, скобок и всего прочего. Первый работает.

str_ireplace() не используете потому что она "(PHP 5)" ?

   
 
 автор: Хулиган   (09.12.2007 в 09:51)   письмо автору
 
   для: kasmanaft   (09.12.2007 в 09:15)
 

preg_quote экранирует не только скобки, но и кучу других символов. Плюс увеличивает длину выделяемого фрагмента текста, и нужно подсчитывать количество спецсимволов в строке поиска и на эту величину уменьшать длину выделяемого фрагмента.

Вариант с preg_replace вообще ничего не выделяет, если в фрагменте есть скобки.

Видимо надо просто заблокировать ввод спецсимволов в поле поиска и не мучаться.

   
 
 автор: kasmanaft   (09.12.2007 в 09:15)   письмо автору
 
   для: Хулиган   (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);
?>

   
 
 автор: exp   (08.12.2007 в 21:13)   письмо автору
 
   для: Хулиган   (08.12.2007 в 18:44)
 

string preg_quote ( string str [, string delimiter] )


Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.

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

   
 
 автор: Хулиган   (08.12.2007 в 18:44)   письмо автору
 
   для: elenaki   (08.12.2007 в 16:17)
 

ну тогда будем отсеивать маньяков :) Путем запрета на ввод скобок.

   
 
 автор: elenaki   (08.12.2007 в 16:17)   письмо автору
 
   для: Хулиган   (08.12.2007 в 16:03)
 

кто же в поиске ищет со скобками? маньяки только...

   
 
 автор: Хулиган   (08.12.2007 в 16:03)   письмо автору
 
   для: sim5   (08.12.2007 в 13:39)
 

Никакой функции, которая позволяла бы сделать escape, я в php не нашёл.
Механическая замена скобок на %28 и %29 при помощи str_replace ничего не даёт - слова перестают выделяться.

   
 
 автор: sim5   (08.12.2007 в 13:39)   письмо автору
 
   для: Хулиган   (08.12.2007 в 13:20)
 

spliti - (string pattern, string string [, int limit])

Обратите, пожалуйста, внимание, что pattern это регулярное выражение. Если вы хотите разделить на любом из символов, имеющих в регулярных выражениях специальное значение, вам нужно сначала мнемонизировать/escape эти символы.

Видимо в этом.

   
 
 автор: Хулиган   (08.12.2007 в 13:20)   письмо автору
 
 

Сделал поиск, вернее выделение жирным шрифтом результатов поиска:


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.
В чём тут ошибка?

   

Сообщения:  [1-9] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования