Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.207.160.209] |
|
Сообщ.
#1
,
|
|
|
Например, можно ли записать шаблон для строки, состоящей из символов a,b,c,d, но не содержащей подстроку bad?
acabadbcad - эта не подходит acadabbcad - эта подходит |
Сообщ.
#2
,
|
|
|
так иди на оборот. если подходит под шаблон bad то такую строку отвергаем. иначе принимаем.
|
Сообщ.
#3
,
|
|
|
Цитата ViktorXP @ так иди на оборот. если подходит под шаблон bad то такую строку отвергаем. иначе принимаем. А если мне такой отрицательное условие надо использовать внутри другого шаблона? Например, такая задача. Нужно найти и удалить все теги span такого вида <span class=bad>text</span>. Проблема в том, что они могут быть вложенные. Например так: <span class=bad>text11<span class=good>text2</span>text12</span>. Если в preg_replace применить шаблон $text = preg_replace( '/<span class=bad>(.+)<\/span>/', '$1', $text ); То найдется вот это <span class=bad>text11<span class=good>text2</span>text12</span>. И после удаления получим text11<span class=good>text2 text12</span>. а должно получиться text11<span class=good>text2</span>text12. Нужно как-то указать, что между <span class=bad> и </span> не должно быть других открывающих тегов span, то есть не должно быть подстроки <span[^>]*>. При этом между ними могут быть любые другие теги. |
Сообщ.
#4
,
|
|
|
Цитата можно ли записать шаблон для строки, состоящей из символов a,b,c,d, но не содержащей подстроку bad? Цитата Нужно найти и удалить все теги span Ну вот опять - сперва автор спрашивает, как правильно класть срубы с помощью пилы, а в итоге выясняется, что нужно построить небоскреб. Надо бы написать правила раздела, и первым же пунктом: HTML не парсится регулярными выражениями! Регвыром можно разбить документ на теги (раздельно открывающие и закрывающие) и сырой текст. Затем другим регвыром анализировать имя и параметры открывающих тегов, чтобы определить, выводить их или нет. Все открывающие теги с флагом "выводить/не выводить" класть в стек, снимать при получении закрывающего тега. |
Сообщ.
#5
,
|
|
|
Лучше разобрать на DOM (например с помощью того же браузера) и искать соотв. методами (getElementsByClassName)
|
Сообщ.
#6
,
|
|
|
S.Eugene, по-моему, там вообще всё удалится. У тебя не написано, что на первом <\/span> надо поиск завершать.
Эта конкретная задача решается и регулярным выражением, но выражение получается слишком громоздким, чтобы вот так сразу его записать. И глубина вложений будет ограничена. Или можно сделать несколькими выражениями. Можно искать выражения /<span class=bad( .*?)>/, /<span( .*?)/ и /<\/span>/ и обрабатывать их как вложенные скобки, но придётся программировать. Можно поиграть с внутренними вложенными парами <span> </span>, проверяя. Но придётся цикл организовывать. Это можно даже в sed сделать. Регулярное выражение (tr1) /<span class=bad>(([^<]|<\/?([^s]|s([^p]|(p[^a]|a([^n]|n[^ >])))))[ >])*?<\/span>/ находит <span class=bad>...</span>, если в него не вложено других <span> |