Регулярное выражение для замены тегов <p>переносами строк - PullRequest
3 голосов
/ 18 апреля 2010

У меня есть следующий HTML

<p>Some text <a title="link" href="http://link.com/" target="_blank">my link</a> more 
text <a title="link" href="http://link.com/" target="_blank">more link</a>.</p>
<p>Another paragraph.</p>
<p>[code:cf]</p>
<p>&lt;cfset ArrFruits = ["Orange", "Apple", "Peach", "Blueberry", </p>
<p>"Blackberry", "Strawberry", "Grape", "Mango", </p>
<p>"Clementine", "Cherry", "Plum", "Guava", </p>
<p>"Cranberry"]&gt;</p>
<p>[/code]</p>
<p>Another line</p>
<p><img src="http://image.jpg" alt="Array" />
</p>
<p>More text</p>
<p>[code:cf]</p>
<p>&lt;table border="1"&gt;</p>
<p> &lt;cfoutput&gt;</p>
<p> &lt;cfloop array="#GroupsOf(ArrFruits, 5)#" index="arrFruitsIX"&gt;</p>
<p>  &lt;tr&gt;</p>
<p> &lt;cfloop array="#arrFruitsIX#" index="arrFruit"&gt;</p>
<p>     &lt;td&gt;#arrFruit#&lt;/td&gt;</p>
<p> &lt;/cfloop&gt;</p>
<p>  &lt;/tr&gt;</p>
<p> &lt;/cfloop&gt;</p>
<p> &lt;/cfoutput&gt;</p>
<p>&lt;/table&gt;</p>
<p>[/code]</p>
<p>With an output that looks like:</p>
<p><img src="another_image.jpg" alt="" width="342" height="85" /></p>

Я пытаюсь написать регулярное выражение, которое удалит все <p> или </p>, и всякий раз, когда оно находит </p>, оно заменяет его переводом строки.

Пока мой шаблон выглядит так:

/\<p\>(.*?)(<\/p>)/g

И я заменяю матчи на:

$1\n

Все выглядит хорошо, но также заменяет содержимое внутри тегов [code][/code], которое в этом случае не должно заменять теги <p>, поэтому в результате я бы хотел избавиться от <p> тегов, когда содержимое не внутри тегов [code].

Я никогда не смогу получить правильное отрицание, я знаю, что это будет что-то вроде

\<p\>^\[code*\](.*?)(<\/p>)

Но, очевидно, это не работает: -)

Может кто-нибудь помочь мне с этим регулярным выражением?

Кстати, я знаю, что вообще не следует использовать регулярные выражения для разбора HTML. Я полностью осознаю это, но, тем не менее, для этого конкретного случая я бы хотел использовать регулярное выражение.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 18 апреля 2010

Я знаю, что не должен использовать обычные выражения для разбора HTML вообще. я полностью осознавая это, но все же, для этот конкретный случай, я хотел бы использовать регулярное выражение.

Можете ли вы объяснить это немного больше?

1 голос
/ 18 апреля 2010

Я предполагаю, что у вас есть специальные знания о приложении, которое сгенерировало HTML, который вы решаете проанализировать, иначе вы бы даже не рассматривали регулярные выражения для задачи . (Я полагаю, что отчасти это знание того, что теги <p> всегда появляются после новой строки, а закрывающие теги </p> всегда появляются перед новой строкой.)

Выше было сказано, что вы не можете легко или эффективно достичь того, чего пытаетесь достичь с помощью одних только регулярных выражений (вам придется использовать сложные вложенные упреждающие и упреждающие утверждения для проверки того, что ваше вхождение <p>...</p> является не в блоке [code]...[/code], и утверждения с нефиксированной длиной особенно ограничены, и простая ошибка IIRC до JDK1.6.)

Сначала необходимо выполнить итерацию по входной последовательности, разбив ее на code и не-code чанки, и перенеся чанки в выходную последовательность либо без изменений (в случае code чанков), либо с помощью <p>...</p> -замена применяется через регулярное выражение или простую замену строки (в случае не-code кусков.)

На ваше усмотрение, если вам придется (или как вы хотите) иметь дело с вложенными или несовпадающими code кусками.

0 голосов
/ 18 апреля 2010

Синтаксис для негативного прогноза: (?!).

(?![code.*?]([^\[]|\[\/[^c]|\[\/c[^o]|\[\/co[^d]|\[\/cod[^e]|\[\/code[^\]])*)<p>.*?</p>

...