Примечание: ОП резко изменил вопрос. Это решение было разработано для решения вопроса в его первоначальной (более сложной) форме (до того, как было добавлено ограничение «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).
| \w+> # 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]