Neden bu regex maç değil mi?

4 Cevap php

Herhangi h1, h2, h3 veya etiketleri içindeki metni eşleştirmek gerekiyordu.

preg_match("<[hH][1-3][^>]*>(.*?)<[hH][1-3]>", $text, $matches);
echo $matches[0];

Ama herhangi yakalar asla.

4 Cevap

Sen ileri eksik etiketinin sonunda ve regex etrafında bölü. Bu deneyin:

preg_match("/<[hH][1-3][^>]*>(.*?)<\/[hH][1-3]>/", $text, $matches);
echo $matches[0];

Sizin regex <h1>Text<h1> yerine <h1>Text</h1> arıyor. Eğik çizgi ekleyerek gerçek HTML yakalayacaktır.

Eğer etkili bir şekilde (açılı ayraçlar) kullanarak sarma konum dışındaki regex sınırlayıcı gerekir. Ve kapanış etiketi üzerinde eğik çizgi. Ben de açılış etiketi yakalayan ve kapanış etiketi aynı olması gerektiren tavsiye edeceğim.

preg_match('!<(h[1-3])[^>]*>(.*?)</\1>!i', $text, $matches);
echo $matches[1];

En azından, size regex sınırlayıcı kaçırıyoruz:

preg_match("/<[hH][1-3][^>]*>(.*?)<[hH][1-3]>/", $text, $matches);
echo $matches[0];

Eric'in kod bazı iyileştirmeler yapılmış. Şimdi < h2 ><h1></h1></ h2 > (bu hiç gerçekleşmesi gerektiğini değil) eşleşir. Bazı konularda, örneğin <h1><!--</h1>--></h1> denemek, hala var.

preg_match("/<\s*[hH]([1-3])\s*>(.*?)<\/\s*[hH]\1\s*>/", $text, $matches);
echo $matches[0];  // the entire matched string
echo $matches[2];  // the contents between the tags