Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение. Проблема с экранированием кавычек в строках. / 4 сообщений из 4, страница 1 из 1
10.03.2006, 11:36:34
    #33592114
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
Задача: Требуется у всех картинок в тексте вырезать http://hostname в атрибуте SRC перед вставкой/обновлением в бд.

Суть в проблемы заключается в том, что для поиска проэкранированных открывающих и закрывающих одинарных/двойных кавычек соответствуют разные подмаски (3, 6). Подробнее см. рег.

Никак не могу понять логику обработки строк в данном контесте. На примере двойной кавычки (")... По логике вещей для нахождения экрана достаточно \\", т.к. " не является спец. символом в регулярном выражении. Что касается закрывающей двойной кавычки, то все корректно. Но для поиска открывающей соответствует подмаска \\\"... (тут я в замешательстве)

Аналогичная ситуация с одинарными.

Вот что получилось:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
<?php
// $_SERVER['HTTP_HOST'] - test

$str = "
    This is test text.
    
    <IMG class='foo' src=\"http://test/images/foo.jpg\" border=0>Image Name 1
    
    Hello world!
    
    <img src='http://test/images/bar.jpg' border=0>Image Name 2
    
    End of text.
";

// экранируем спец. символы перед вставкой в бд
$str = addslashes($str);

// вырезаем у картинок http://test
$str1 = preg_replace('/^(.*)<img(.*)src=(\\\\\'|\\\")?(http:\/\/'.$_SERVER['HTTP_HOST'].')([a-zA-Z_0-9\.\/]+)(\\\'|\\")?(.*)>(.*)$/im',
 "\${ 1 }<IMG\${ 2 }src=\${ 3 }\${ 5 }\${ 6 }\${ 7 }>\${ 8 }", $str);

echo $str1;

// вырезаем у картинок http://test (не работает)
$str2 = preg_replace('/^(.*)<img(.*)src=(\\\'|\\")?(http:\/\/'.$_SERVER['HTTP_HOST'].')([a-zA-Z_0- 9 \.\/]+)(\\\\\'|\\")?(.*)>(.*)$/im',
 "\${1}<IMG\${2}src=\${3}\${5}\${6}\${7}>\${8}", $str);

echo $str2;
?>

Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    This is test text.
    
    <IMG class=\'foo\' src=\"/images/foo.jpg\" border=0>Image Name 1
    
    Hello world!
    
    <IMG src=\'/images/bar.jpg\' border=0>Image Name 2
    
    End of text.

    This is test text.
    
    <IMG class=\'foo\' src=\"http://test/images/foo.jpg\" border=0>Image Name 1
    
    Hello world!
    
    <img src=\'http://test/images/bar.jpg\' border=0>Image Name 2
    
    End of text.

Подскажите, в чем может быть объяснение данной ситуации. :)
Перечитал уже мануал вдоль и поперек, но никак не вижу логики.

PHP 4.3.10
...
Рейтинг: 0 / 0
10.03.2006, 12:55:57
    #33592467
VERS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
Я честно не понял в чем проблема) Но почему бы не экранировать после того, как уберешь ненужные куски, например:
Код: plaintext
1.
2.
$str1 = preg_replace("/(<img[^>]+?src=[\"']*)(http:\/\/".$_SERVER['HTTP_HOST'].")([^>]*>)/im", "$1$3", $str);
$str = mysql_escape_string($str1);
-------------------------------
www.free-lancer.ru
...
Рейтинг: 0 / 0
10.03.2006, 15:18:30
    #33593020
Berkut
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
VERS , спасибо!
Твой вариант более изящный! :)

Кое-что подправил и стало нормально:
Код: plaintext
1.
2.
$str1 = preg_replace("/(<img[^>]+?src=\\\\[\"']*)(http:\/\/".$_SERVER['HTTP_HOST'].")([a-zA-Z_0-9\.\/]+\\\\[\"']*[^>]*>)/im",
 "$ 1 $ 3 ", $str);

VERSЯ честно не понял в чем проблема)
Старался объяснить как можно понятнее... :)
Попытаюсь еще раз.

Текст паттерна у нас заключен в одинарные кавычки. Следовательно, чтобы
найти " или ' надо записать " и \' соотвественно. Затем, ищем экраны перед самими кавычками - это \\" (для двойных) и \\\' (для одинарных), т.к. сначала паттерн парсится как строка, а потом как рег. выражение. Вроде бы все верно.
Но! Для нахождения открывающих и закрывающих кавычек соотвествуют различные шаблоны! ... ???

Другими словами, чтобы найти открывающую кавычку следует использовать шаблоны \\\\\' или \\\".
Где здесь логика?
...
Рейтинг: 0 / 0
14.03.2006, 23:34:18
    #33600904
Dipish
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
Логика действительно какая-то запутанная =)
Может поможет функция
preg_quote($text)
?
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение. Проблема с экранированием кавычек в строках. / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]