Сопоставлять только обратные метки, не входящие в блок <code>, с регулярным выражением - PullRequest
1 голос
/ 11 июля 2010

обо всем по порядку. Я знаю, как анализировать XML / HTML с помощью simplexml, и я знаю все аргументы против использования RegEx для его анализа. Этот вопрос ради знаний.

Что должно произойти

В блоке текста, скажем, у нас есть следующая строка текста:

The query you need to use is 
<code>SELECT `post_name` FROM table WHERE id= $id</code> 
where `$id` is the `user_ID` we got earlier.

Как вы подходите к следующему:

 `$id`
 `user_ID`

без совпадения

`post_name`?

Требования

Это должно быть решение только для регулярных выражений. Я понимаю и знаю, как использовать такие вещи, как preg_replace_callback и т. Д., Чтобы сначала удалить блоки <code> из строки, но я ищу решение только для регулярных выражений. Кроме того, он должен иметь возможность обрабатывать возможные атрибуты, такие как <code lang="php">.

Регулярное выражение должно соответствовать парам обратных галочек, которые не находятся между <code> и , и совпадения могут не содержать <code> или для обработки одиночных спинок в других контекстах.

Содержимое в обратных чертах никогда не будет многострочным.

Рассуждения

Я работаю над личным проектом, где это был возможный крайний случай. Это не проект с уценкой, в котором можно изменить порядок вызовов. Теги <code> находятся в исходном тексте и никуда не денутся.

Кроме того, одна из причин, по которой я не хочу отвечать «use simpleXML», заключается в том, что обратные галочки не находятся внутри реальных <code> блоков. Это просто удобный способ объяснить проблему, и решение для блоков <code> будет работать с небольшими изменениями.

1 Ответ

6 голосов
/ 11 июля 2010

Я не думаю, что регулярные выражения являются хорошим инструментом для этого, но это можно сделать, если предположить, что теги кода не являются вложенными:

`(?:(?!</?code>)[^`])*`(?!(?:(?!<code>).)*</code>)

Это означает:

`(?:(?!</?code>)[^`])*`       : Match something in backticks unless it
                                contains <code> or </code> or a backtick...
(?!(?:(?!<code>).)*</code>)   : unless it is followed by a </code>
                                without a <code> first.

Смотрите регулярное выражение в действии на rubular .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...