PHP Regexp: kereden daha fazla oluşabilir alt şablonun

3 Cevap php

Hey orada, ben böyle bir kod için normal bir ifade yazmak çalışıyorum:

<tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
</tr>
<tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
    <td>7181</td>
</tr>

(Ben ... kötü html kodunu biliyorum)

Şimdi her tablo satırında arar bir ifade istiyorsanız ve ([0-9] {4}) dinamik numaralarını işleyebilir. Iki hücre vardır Yani, ben üç varsa, benim dizi içindeki tüm üç değer olmalı, iki değerleri içeren bir dizi almak istiyorum.

Benim sıradanifade başlangıç ​​ve sona ermeli:

!<tr> ..... </tr>!sU

Bu mümkün mü?

Teşekkürler!

3 Cevap

Şimdi her tablo satırında arar bir ifade istiyorsanız ve ([0-9] {4}) dinamik numaralarını işleyebilir. Iki hücre vardır Yani, ben üç varsa, benim dizi içindeki tüm üç değer olmalı, iki değerleri içeren bir dizi almak istiyorum. (...) Mümkün mü?

Hayır, öyle değil. Sen alt desen dinamik bir sayı ile bir desen yazamam.

My regexp HAS TO start and end with:
!<tr> ..... </tr>!sU

Neden ki?

Eğer gerçekten yerine XML çözümleyici veya Tidy gibi daha bağışlayıcı bir şey kullanarak normal ifadeler kullanmak istiyorsanız, bir iki adım yaklaşımını öneririz.

First step: <tr> satırlar bul:

!<tr>(.*?)</tr>!

Second step: sonuçlarını üzerinde yineleme ve <td> s arayın:

!<td>(?:<[^>]+>)*(\d{4})(?:<[^>]+>)*</td>!

Bu <td> içinde 4 ondalık karakter (0-9) dizileri bulmak ve aynı zamanda gibi iç içe biçimlendirme etiketlerini maçlar olacak

<td><strong>1234</strong></td>

Bu başlamanıza yardımcı olmalıdır

$html = ...as above
preg_match_all('~<tr>.+?(\d+).+?</tr>~si', $html, $matches);
print_r($matches);

sıradanifade hiyerarşik yapıların değerlendirilmesini ve özellikle xml ile çok herkesin bildiği kötü. Sen DOMXPath ile SimpleXML veya DOMDocument kullanarak çok daha iyi

http://www.php.net/manual/en/simplexmlelement.xpath.php SimpleXML ile XPath kullanmak için nasıl bak

ve

http://www.php.net/manual/en/domxpath.evaluate.php bu DOMXPath ile yapılabilir nasıl.

Senin durumunda söz verilen kadar basit ise, o SimpleXML daha iyi bir seçim olduğunu unutmayın. Orada DOMDocument daha uygun olacaktır Bazı durumlarda bu yüzden bu kararı için daha fazla bilgi olması iyi olurdu

Örneğin:

<?php
$string = <<<XML
<table>
  <tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
  </tr>
  <tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
    <td>7181</td>
  </tr>
</table>
XML;

$xml = new SimpleXMLElement($string);

/* Search for <a><b><c> */
$result = $xml->xpath('//tr/td[text() = number(text())');

while(list( , $node) = each($result)) {
    echo $node,"\n";
}

?>