Помогите с регулярным выражением для поиска в xhtml

phprus

Moderator
Команда форума
Помогите с регулярным выражением для поиска в xhtml

Есть строка, в ней есть валидный xhtml.
Нужно найти вхождения некоторой строки Х в xhtml-документе, такие что эти вхождения находятся не внутри тага и не обрамлены тагами code и pre.
Тоесть если ищется строка "src" в коде
... <img src="" ...="src"><pre...>src</pre>
<p>...src...</p>
то должна быть найдена только выделенная подстрока.

Подскажите пожалуйста, как можно решить эту задачу или в каком направлении думать.
 

Bitterman

Новичок
Заменить на пробелы сначала все, что обрамлено тегами pre и code, затем заменить на пробелы все теги. В оставшейся строке производить поиск. Я бы копал в эту сторону.
 

phprus

Moderator
Команда форума
Bitterman
Так не получится, так как надо не просто найти эти подстроки, а найти для замены. Те на выходе должен получиться документ со всей разметкой, но с произведенными заменами.

Можно конечно попробовать заменять все что внутри pre и code заменять к примеру на их base64(или на какой либо идентификатор, с хранением содержимого отдельно), после этого проводить замену и проводить раскодирование текста в тегах, но я не могу гарантировать, что искомая строка не может встретиться внутри base64-представления, по этому так делать бы не хотелось...
 

tf

крылья рулят
а что за строка X у тебя?
что об ней известно?

-~{}~ 25.06.09 11:28:

внутри pre и code заменять к примеру на их base64(или на какой либо идентификатор, с хранением содержимого отдельно), после этого проводить замену и проводить раскодирование текста в тегах
можно просто менять на пустоту вместо идентификатора (по массиву временного хранения потом собирать обратно)
но хотелось бы увидеть регулярку :)
 

phprus

Moderator
Команда форума
tf
О Х известно, что это регулярное выражение, которое представляет из себя список возможных альтернатив( те a|b|c ), в котором точно не встречаются html теги. Те ни в одной из искомых подстрок точно нету символов < и >.
Пока ничего более конкретного сформулировать не могу.

Делается это для функции автозамены, при этом список замен приходит из сторонних источников и что там могут напридумывать неизвестно. Известно лишь отсутствие тегов и невалидных xhtml конструкций.

можно просто менять на пустоту вместо идентификатора
После замены длина строки может измениться. Или предлагается разбить строку на массив так, чтобы в массиве в строках был либо код в котором можно искать, либо блок <pre>...</pre>, заменить в возможных строках, а потом склеить массив?
 

tf

крылья рулят
для каждой последовательности
<pre>...</pre>
<code>...</code>
<pre>...</pre>
будет массив
0=>...
1=>...
2=>...
это вместо
заменять все что внутри pre и code заменять к примеру на их base64(или на какой либо идентификатор, с хранением содержимого отдельно)
-~{}~ 26.06.09 20:45:

правдо если замены создадут тег <pre> у тебя будут проблемы))
а так можно сделать на основе strpos, менять кусками, до тега, после тега до следующего
 

phprus

Moderator
Команда форума
Всем спасибо за советы!

Я в итоге сделал при помощи построения DOM-дерева и работы с ним, а регулярные выражения применил только для поиска внутри текстовых узлов.
 
Сверху