Bir satırdaki bir hücreyi eklemek için php regex kullanarak

3 Cevap php

Her zamanki gibi sorun iyi bir regex yazı var.

Ben Joomla makale başlıklarının sağında çekirdek tarafından üretilen isteğe bağlı yazdırma, e-posta ve PDF düğmeleri bir düğme eklemek için bir eklenti yapmaya çalışıyorum. Ben başarılı olursa ben GPL altında dağıtmak olacaktır. Ben buldum örneklerin hiçbiri işe görünüyor ve ben bir php-tek çözüm oluşturmak istiyorum.

Fikir, bir veya daha fazla regex için makale başlıkları ve düğmeler için Joomla çıkış benzersiz desen kullanmaktır. Bir regex class "contentpaneopen" ile bir tablo arıyorum (bir sayfada birkaç tane olan) ve sınıf ile bir hücreyi içeren "contentheading" tarafından doğru tabloyu bulur. Bu tablodaki class "buttonheading" ile bir hücre varsa ikinci bir regex kontrol edebilir. Bu hücrelerin sayısı üçe sıfırdan olabilir ama ilk regex birden fazla maç dönerse ben bu çeki kullanabilirsiniz. Bu grubu, ben aynı masada tarafından tabloyu değiştirmek istiyorum ama ekstra hücre düğmesini tutarak ben eklemek istiyorum. Ben son satırı ve tablo kapanış etiketleri kalktıktan ve tekrar bu kapanış etiketleri eklemeden önce benim düğme hücre takarak bunu yapabilir.

Normal Joomla çıktı şuna benzer:

<table class="contentpaneopen">
    <tbody>
    	<tr>
    		<td width="100%" class="contentheading">
    			<a class="contentpagetitle" href="url">Title Here</a>
    		</td>
    		<td width="100%" align="right" class="buttonheading">
    			<a rel="nofollow" onclick="etc" title="PDF" href="url"><img alt="PDF" src="/templates/neutral/images/pdf_button.png"/></a>
    		</td>
    		<td width="100%" align="right" class="buttonheading">
    			<a rel="nofollow" onclick="etc" title="Print" href="url"><img alt="Print" src="/templates/neutral/images/printButton.png" ></a>
    		</td>
    	</tr>
    </tbody>
</table>

Kod çok kabaca böyle bir şey olacaktır:

$subject = $article;
$pattern1 = '[regex1]'; //<table class="contentpaneopen">etc</table>
preg_match($pattern, $subject, $match);
$pattern2 = '[regex2]'; //</tr></tbody></table>
$replacement = [mybutton];
echo preg_replace($pattern2, $replacement, $match);

İyi bir regex olmadan orada kod kalanını yapıyor küçük nokta, bu yüzden birisi bu yardımcı olur umarım!

3 Cevap

Bu çok üzerinde ortak bir soru ve cevap hep aynı: düzenli ifadeler ayrıştırma veya işleme HTML veya XML için kötü bir seçimdir. Onlar yıkmak birçok yolu vardır. PHP çok daha sağlam olacak en az üç yerleşik HTML ayrıştırıcıların ile birlikte gelir.

Parse HTML With PHP And DOM bir göz atın ve benzeri bir şey kullanın:

$html = new DomDocument;
$html->loadHTML($source); 
$html->preserveWhiteSpace = false; 
$tables = $html->getElementsByTagName('table'); 
foreach ($tables as $table) {
  if ($table->getAttribute('class') == 'contentpaneopen') {
    // replace it with something else
  }
}

Bunun için regex kullanmak gerekir bir nedeni var mı? DOM ayrıştırma çok daha basit olurdu.

Eğer sağlanan senaryoda bir eklenti, bir sayfayı yüklemek her denir yana, bir regex yaklaşım bir çok insan bu yaklaşımı kullanmak, bu yüzden bir dom çağrı daha hızlıdır. Sağlanan senaryoda bir regex bir dom yaklaşımı kullanmaya çalışırken daha iyidir çok neden Joomla's documentation olarak görebilirsiniz.

Sizin çözüm ile sorun Joomla'nın varsayılan şablon ile bağlı olmasıdır. Tüm şablonları aynı class="contentheading" yapısını kullanıyorsa ben hatırlamıyorum. Eğer böyle bir uzantı GPL planlıyorsanız, bu konuda dikkatli olmalıdır.

Ne yapmaya çalışıyorsun bir template override, daha detaylı olarak açıklandığı gibi görünüyor bana here. Çok daha basit bir çözüm. Örneğin, Yazınızın başlığı sitesini oluşturur php:

<div class="componentheading<?php echo $this->params->get('pageclass_sfx')?>">
    <h2><?php echo $this->escape($this->params->get('page_title')); ?></h2>
</div>

Sadece com_content makale şablonu geçersiz kılmak gerekir, ve >get('page_title') çağrısından sonra pdf düğmeleri için html echo. Eğer html yankı istemiyorsanız, size, bir modül veya bileşen oluşturmak şablona ithal ve >get('page_title') Eğer html göstermek sizin bileşeni yöntemlerini çağırdıktan sonra olabilir.

Bu bileşen çeşitli kutularını "gösterisi pdf (evet / hayır)" ve diğer ilginç eylemler olabilir.