Bu "tek bir düzenli ifade" değil, ancak sizin giriş dizesi olduğunu düşünüyor, işi yapmalıyım $str
:
$lines = explode(PHP_EOL, $str);
$linesToKeep = array();
foreach ($lines as $line) {
if (!preg_match('#</?(' . $blockTags . ')>#', $line)) {
$linesToKeep[] = $line;
}
}
// Et voila ;-)
$strOK = implode(PHP_EOL, $linesToKeep);
var_dump($strOK);
Birkaç kelime:
- (Eğer satır satır tutmak veya reddetmek istediğiniz gibi) hattında çalışmaya dize patlar.
- o satır satır döngüler
- hat
<TAG>
ya da </TAG>
içermiyorsa, bu $linesToKeep
dizi konur
- sonunda, çıktıya dize o diziye ne inşa edilmiştir
Belki de olsa, yapmak için daha kısa bir yolu vardır ... Ama bu bir anlamak için yeterince kolaydır, ben (bazı tür "regex cehennem" ya da ne olursa olsun hiç kimse ^ ^ korumak mümkün olacağını değil) tahmin
Düzenleme: Ben OP yeniden okurken, ben son satırı bir açılış etiketi ile bir çizgi dışlamak istiyorsanız o ... benim koduyla değil iken, dışlanmış, ve fark ettim bunu, burada başka bir önerme hemen sonra bir :
$lines = explode(PHP_EOL, $str);
$linesToKeep = array();
$i = 0;
$numLines = count($lines);
for ($i=0 ; $i<$numLines ; $i++) {
$line = $lines[$i];
if (!preg_match('#</?(' . $blockTags . ')>#', $line)) {
$linesToKeep[] = $line;
} else {
if (preg_match('#<(' . $blockTags . ')>#', $line)) {
// Opening tag, skip next line too ?
$i++;
}
}
}
$strOK = implode(PHP_EOL, $linesToKeep);
var_dump($strOK);
Eğer kapanış etiketi kadar satırları atlamak istiyorsanız, bunu yapabilirsiniz nerede $i++
koymak - ama ^ ^ (And "parsing" HTML by-hand might not be such a good idea, if you want to get to something complicated ^^ ) / anlamak okumak için zorlaştırmaya oluyor