Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   регулярные выражения (https://forum.antichat.xyz/showthread.php?t=54940)

Дикс 03.12.2007 16:50

регулярные выражения
 
пытаюсь написать собственный парсер для ИМГ тегов.

PHP код:

$data "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
eregi("(\[img\]([a-z.]+)\[/img\])"$data$regs);

echo (
"<pre>");
print_r($regs);
echo (
"</pre>"); 

на данный момент встал вопрос:
почему результат выводит один тег два раза?

PHP код:

Array
(
    [
0] => [img]hack.jpg[/img]
    [
1] => [img]hack.jpg[/img]
    [
2] => hack.jpg



groundhog 03.12.2007 16:55

Он сначала тебе выводит полностью шаблон, потом совпадение с первым подшаблоном, потом со вторым.

Дикс 03.12.2007 17:09

ничо не понимаю

ну а здесь что может быть не так?
PHP код:

  $str "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
  
$pattern "/([img\])/i";
  
$replacement "1 \${1}";
  print 
preg_replace($pattern$replacement$str); // line 30 

PHP код:

Warningpreg_replace() [function.preg-replace]: Compilation failedmissing terminating ] for character class at offset 8 in h:\home\localhost\www\txtdb\r.php on line 30 


groundhog 03.12.2007 17:17

Ошибка в паттерне:

Цитата:

$pattern = "/([img\])/i";
Обрати внимание, что у тебя внутри шаблона идёт квадратная скобка [. В терминах regexp всё что между квадратных скобок трактуется как класс символов ([a-zA-Z] и т.д.). У тебя же, как я понимаю, знчение квадратной скобки должно быть "как символ"... Вот и экранируй его тогда... Причём вторую скобку ты проэкранировал, а первую забыл... Делай так:

Цитата:

$pattern = "/(\[img\])/i";

AkyHa_MaTaTa 03.12.2007 17:29

Че та я не доганю, ты хочешь заменить все теги на img на 1$

Дикс 03.12.2007 17:31

cпасибо большое, тока я всё ещё не могу получить желаемое:

PHP код:

 $str "текст факинг текст [img]hack.jpg[/img] второй текст [img]deex.jpg[/img]";
$pattern "/(\[img\])([a-z.A-Z0-9]+)(\[/img\])/i";
  
$replacement "<a href='img/\${2}'>\${2}</a>";
  print 
preg_replace($pattern$replacement$str); // line 30 

проблема вот в этом:
$pattern = "/(\[img\])([a-z.A-Z0-9]+)(\[/img\])/i";
когда я добавляю этот кусок, у меня всё бьётся. а без него я получаю то что хочу -
[img]hack.jpg[/img] превращается в ссылку, но в конце остаётся [/img]:


текст факинг текст hack.jpg[/img] второй текст deex.jpg[/img]

groundhog 03.12.2007 17:36

А так не пробовал?

Цитата:

$pattern = "/(\[img\])([a-z.A-Z0-9]+)(\[\/img\])/i";

Дикс 03.12.2007 17:38

О да! Под вечер башка совсем варить отказывается :)
Спасиба большое :)


Время: 18:49