PDA

Просмотр полной версии : регулярные выражения


Дикс
03.12.2007, 16:50
пытаюсь написать собственный парсер для ИМГ тегов.


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

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


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


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

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

Дикс
03.12.2007, 17:09
ничо не понимаю

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

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



Warning: preg_replace() [function.preg-replace]: Compilation failed: missing 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пасибо большое, тока я всё ещё не могу получить желаемое:


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


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


текст факинг текст hack.jpg (http://x.ru) второй текст deex.jpg (http://x.ru)[/img]

groundhog
03.12.2007, 17:36
А так не пробовал?

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

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