regex: maç dize yalnızca bir etiket parçası değil

5 Cevap php

Bir html etiketi parçası değil, yalnızca bir dize maç için çalışıyorum.

For example when searching for the string: "abc". <a href="foo.html">abc def</a> should match <p> foo bar foo abc foo bar</p> should match

but <a href="abc.html">foo</a> should not match.

Yardımın için teşekkürler!

5 Cevap

HTML düzenli değildir çünkü ben gerçekten, HTML maç için İfadelerinin kullanmak olmaz ve size çelme kenar durumlarda bir yük vardır. simplest durumlarda tüm ama ben bir HTML çözümleyici (örneğin this one PHP için) kullanmak istiyorum.

Brian bir regex kullanmak istiyorsanız, o kimse seni girişleri uygun, neyse, bir nokta var:

.*>[^<]*abc[^<]*<.*

Ben herhangi bir regex bazı CDATA bölümleri kırmaya gidiyor oldukça eminim.

Ne aradığınız bir DOM ayrıştırıcı. İşte tüm HTML dışarı şerit ve size daha sonra maç incelemekte olduğunuz sayfa düz metin sağlayacaktır. Değil emin ne kullanım durumda, ama DOM manipüle değiliz varsayarak değilim, yoksa JavaScript kullanarak olurdu.

Sadece bilgi ayıklamak ediyorsanız, The Simple HTML DOM Parser gibi bir şey kullanarak sayfa ayrıştırmak ve sonra çözümlenen nesne alabilirsiniz düz metin karşı maç.

Ben de Brian 's comment, i sık sık düzenli ifadeler ile hızlı ve kirli ayrıştırma yapmak, ve durum için kabul ederken, ben böyle bir şey kullanmak istiyorum:

  • Verileri "seri"
s/[\r\n]//
s/<!\[CDATA\[.*?]]>//
s/</\n</
s/>/>\n/
  • sonra sadece < ile başlayan tüm satırları filtrelemek
s/^<.*//

Ne sol konum sadece metin (ve muhtemelen beyaz bir çok alanı) olduğunu. Bu düzenli ifadeler hakkında daha az ve arama ve değiştirme hakkında daha fazla olmasına rağmen.