webew
Войти » Регистрация
 
PHP

Как в preg_replace отловить разные кавычки

4 марта 2013, 22:25
Автор: platedz
Здравствуйте, подскажите пожалуйста. Скажем нужно вырезать все, что внутри style

Как записать что-то навроде

preg_replace('|style=("|')(.*?)("|')|i','',$string);


Пробовал экранировать одинарную кавычку внутри ("|\'), все-равно не выходит
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

platedz

Корректнее видимо будет так
preg_replace('~style=("|')(.*?)("|')~i','',$string);

Иначе наличие прямой черты в самом выражении вызовет ошибку, но проблему с кавычками это все равно не решает.
04.03.2013, 22:27
Ответить

1234ru

preg_replace(
        '/
          # шаблон с модифакатором x - расширенный режим,
          # в котором не учитываются пробелы,
          # чтобы можно форматировать шаблон
          # и писать комментарии
         
          (?<=style=") # целевому тексту предшествует style="
         
          [^"]+        # целевой текст - любое количество символов,
                       # не являющихся двойной кавычкой
         
          (?=")        # за целевым текстом следовует кавычка
        /x'
,
        '',
        $string
    );
То, что не убивает нас, делает нас инвалидами.
04.03.2013, 23:41
Ответить
NO USERPIC

platedz

Проблема в том, что style может быть в одинарной или двойной кавычке.

Например, так вполне нормально работает

preg_replace('|style="(.*?)"|i','',$string);


Т.е. меня интересует, как записать условие такого типа ("|')

А за модификатор x большое спасибо, надо будет попробовать.
Только наверное переносы и табы он все равно учитывает?

Но это не главное, а самый главный вопрос в целом про кавычки
05.03.2013, 00:26
Ответить
NO USERPIC

platedz

Все вроде разобрался. Проблема видимо в другом была.
05.03.2013, 02:42
Ответить

1234ru

preg_replace(
        '/
             
          (?<=style=
           
            (?:      # ?: - незахватывающая подмаска
                     # (не участвует в нумерации)
             
                  (")    # подмаска № 1 - одна двойная кавычка
                 
                  |
                 
                  (\')   # подмаска № 2 - одна одинарная
                         # кавычка (слэш - это от PHP)
                )
               
          )
         
          (?(1) # т.н. условная подмаска -
                # различное поведения шаблона
                # в зависимости от того, совпала ли
                # указанная подмаска (в данном случае
                # № 1 - та, что с двойной кавычкой)
               
             [^"]+  # Если подмаска с двойной кавычкой
                    # совпала - значит, стилевые правила
                    # заключены в двойные кавычки,
                    # соответственно, между ними
                    # нужно искать всё, кроме них самих.
                   
             |      # Вертикальная черта отделяет
                    # выражение для случая совпадения
                    # указанной в условии подмаски
                    # от выражения для случая несовпадения
                   
             [^\']+ # В данном случае несовпадение
                    # первой подмаски - с двойной кавычкой -
                    # означает обязательное совпадение
                    # второй - с одинарной кавычкой;
                    # значит, внутри ищем всё,
                    # кроме одинарных кавычек
                    # (слэш опять же для PHP)
             
          ) # конец условной подмаски
         
        /x'
,
        '',
        $string
    );



Ну, а если не заморачиваться случаями, когда внутри двойных кавычек могут оказаться одинарные и наоборот, то можно вот так:

preg_replace(
        '/
          (?<=style=([\'"])) # подмаска № 1 - одна двойная
                             # или одинарная кавычка
         
            [^\'"]+
           
          (?=\1) # ссылка на подмаску № 1 -
                 # обеспечивает совпадение с кавычкой
                 # именно того вида, который встретился
                 # в начале (полная форма записи - \g{1} )
        /x'
,
        '',
        $string
    );




Цитата:
Только наверное переносы и табы он все равно учитывает?


Нет, не учитывает. Из руководства:

Цитата:
... неэкранированные пробелы, символы табуляции и пустой строки будут проигнорированы в шаблоне, если они не являются частью символьного класса.
То, что не убивает нас, делает нас инвалидами.
05.03.2013, 02:49
Ответить
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: