powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
4 сообщений из 4, страница 1 из 1
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
    #33592114
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача: Требуется у всех картинок в тексте вырезать 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
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
    #33592467
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я честно не понял в чем проблема) Но почему бы не экранировать после того, как уберешь ненужные куски, например:
Код: 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
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
    #33593020
Фотография Berkut
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
    #33600904
Dipish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Логика действительно какая-то запутанная =)
Может поможет функция
preg_quote($text)
?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Регулярное выражение. Проблема с экранированием кавычек в строках.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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