regex - maç değil etiketinde

3 Cevap php

this should be easy but somehow I can't figure it out: I have HTML snippet like this one: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...

I need to match numbers 1, 20, 30 (only those) and replace them with links. Obviously I do not want to replace numbers inside tag

The output should be: <p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some <a href="#20">20</a> text <a href="#1">1</a> <b><a href="#30">30</a></b> with some numbers <a href="#30">30</a> <a href="#20">20</a></p> ...

Bu benim ne var:

$text = '<p style="padding:0 10 20 30; margin: 1 2 3 4 ">This is 201 some 20 text 1 <b>30</b> with some numbers 30 20</p> ...';

$pat[]  = '/(?<=\>)([^<]*)([^0-9\:])(1|20|30)([^0-9])/s';
$repl[] = '$1$2<a href="#$3" class="p2">$3</a>$4';
echo preg_replace($pat, $repl, $text);

Bu çalışıyor ama bir seferde sadece tek bir numara ile eşleşir ve ben döngüde çalıştırmak istemiyorum.

Herhangi bir fikir?

-

I see the point of using HTML parser, however it seems like something that can be done with regexp. Especially when there is no standard library for parsing HTML in PHP, and I'm not sure if I want to import third party HTML parser just for this task. Any attempt to fix my regex?

- I managed to write regexp that works in my case. If anyone is interested:

$pat[] = '/>(([^<]*)(([^0-9\:]))|())(1|20|30)(?(?=[<]+?)(?!<\/a>)|(([^0-9\<])([^<]*)<(?!\/a>)))/sU'; $repl[] = '>$1<a href="#$6" class="p22">$6</a>$7';

Ben kolayca HTML çözümleyici ile gerçekleştirilebilir olduğunu çok iyi biliyorum, ama benim yazılım üçüncü parti ayrıştırıcıları eklemek istemiyorum.

Regards, Philia

3 Cevap

Sonlu otomata ile tarif edilebilir olanlar - düzenli ifadeler ayrıştırmak için regular languages içindir. HTML normal bir dil değildir. Düzenli ifadeler ile HTML ayrıştırma Ctuhlu yoludur: http://www.codinghorror.com/blog/archives/001311.html.

Bu gerçekten basit: bir HTML çözümleyici sadece metin ayıklamak, o düzenli ifadeler kullanın.

Normal bir dil değildir, çünkü HTML regex çözümlü olmamalıdır. Düzgün XHTML oluşturmak için bunu yapmak mümkün olabilir, ama ben bunu tavsiye etmem. Bkz the most voted up answer on SO