Веселье с повторным Fmap

Примечание: ОП резко изменил вопрос. Это решение было разработано для решения вопроса в его первоначальной (более сложной) форме (до того, как было добавлено ограничение «www.example.com».) Хотя для решения этого дополнительного ограничения было изменено следующее решение, теперь было бы более простое решение

function strip_bracketed_special($text) {
    $re = '% # Remove bracketed text having "www.example.com" within markup.
          # Skip comments, CDATA, SCRIPT & STYLE elements, and HTML tags.
          (                      # $1: HTML stuff to be left alone.
                       # HTML comments (non-SGML compliant).
          |   # CDATA sections
          |   # SCRIPT elements.
          |     # STYLE elements.
          | <\w+                 # HTML element start tags.
            (?:                  # Group optional attributes.
              \s+                # Attributes separated by whitespace.
              [\w:.-]+           # Attribute name is required
              (?:                # Group for optional attribute value.
                \s*=\s*          # Name and value separated by "="
                (?:              # Group for value alternatives.
                  "[^"]*"        # Either double quoted string,
                | \'[^\']*\'     # or single quoted string,
                | [\w:.-]+       # or un-quoted string (limited chars).
                )                # End group of value alternatives.
              )?                 # Attribute values are optional.
            )*                   # Zero or more start tag attributes.
            \s*/?>               # End of start tag (optional self-close).
          |                # HTML element end tags.
          )                      # End #1: HTML Stuff to be left alone.
        | # Or... Bracketed structures containing www.example.com
          \s*\[                  # (optional ws), Opening bracket.
          [^\]]*?                # Match up to required content.
          www\.example\.com      # Required bracketed content.
          [^\]]*                 # Match up to closing bracket.
          \]\s*                  # Closing bracket, (optional ws).
        %six';
    return preg_replace($re, '$1', $text);
}

Обратите внимание, что регулярное выражение пропускает удаление заключенного в скобки материала изнутри: комментарии HTML, разделы CDATA, SCRIPT и т. д. STYLE и из значений атрибутов HTML-тегов. Учитывая следующую разметку XHTML (которая проверяет эти сценарии), вышеуказанная функция корректно удаляет только содержимое в скобках внутри содержимого элемента html:




    Test special removal. [Remove this www.example.com]
    
    
    



Test special removal. [Remove this www.example.com]

Test special removal. [Remove this www.example.com]

Test special removal. [Do not remove this] Test special removal. [Remove this www.example.com]

Вот такая же разметка после выполнения функции PHP выше:




    Test special removal.
    
    
    



Test special removal.

Test special removal.

Test special removal. [Do not remove this] Test special removal.

Это решение должно работать достаточно хорошо для любого допустимого (X) HTML, который вы можете на него набросать. (Но, пожалуйста, никаких фанки shorttags или комментариев SGML !) [/ ​​G6]

54
задан ehird 5 January 2012 в 06:01
поделиться