php bir dize bir kısmını ayıklamak için nasıl

5 Cevap php

Bazı dize değiştirilmesi için () preg_replace kullanıyorum.

$str = "<aa>Let's find the stuff qwe in between <id>12345</id> these two previous brackets</h>";

$do = preg_match("/qwe(.*)12345/", $str, $matches);

sadece iyi çalışıyor ve aşağıdaki sonucu verir bir

$match[0]=qwe in between 12345
$match[1]=in between 

ama ben şu dizeden ayıklamak için aynı mantık kullanıyorum.

<text>
  <src><![CDATA[<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Arial" SIZE="36" COLOR="#999999" LETTERSPACING="0" KERNING="0">r1 text 1  </FONT></P></TEXTFORMAT>]]></src>
  <width>45%</width>
  <height>12%</height>
  <left>30.416666666666668%</left>
  <top>3.0416666666666665%</top>
  <begin>2s</begin>
  <dur>10s</dur>
  <transIn>fadeIn</transIn>
  <transOut>fadeOut</transOut>
  <id>E2159292994B083ACA7ABC7799BBEF3F7198FFA2</id>
</text>

Ben gelen dize ayıklamak istiyorum

r1text1

karşı

</id>

Şu anda var Düzenli ifade:

preg_match('/r1text1(.*)</id\>/', $metadata], $matches);

$ meta Yukarıdaki string nerede ..

$matches does not return anything.... For some reason...how do i do it? Thanks in advance

5 Cevap

Bir <![CDATA[ içinde başlayan ve sağ kapanış XML etiketi </id> önce biten (bir eksik XML parçası üzerinde regex maç neden bilmiyorum bile, üç bariz sorunlar var Lütfen regex:

  1. Amri dediği gibi: Eğer desen sınırlayıcı olarak / kullanın çünkü kapanış XML etiketi / karakteri kaçmak zorunda. Arada, > karakteri kaçmak zorunda değilsiniz. Bu size verir: '/r1text1(.*)<\/id>/' Alternatif için desen sınırlayıcı değiştirebilirsiniz # örneğin: '#r1text1(.*)</id>#' (ben daha fazla ifadeyi geliştirmek için ilk desen kullanacağız).

  2. Rich Adams dediği gibi: Sizin örnek veri metin "r1_text_1" dir (_ bir boşluk karakteri) ama [(3)] {karşı maç }. Sen regex boşluk veya '/r1(?:\s*)text(?:\s*)1(.*)<\/id>/' (?: non-yakalayan alt şablonların için sözdizimi) gibi alanlarda bir belirsiz dizi için izin vermek zorunda

  3. Lütfen regex . (nokta) varsayılan olarak satırsonlarını eşleşmiyor. Sen izin s (PCRE_DOTALL) desen değiştirici eklemek zorunda satırsonlarının karşı . (nokta) maç sıra: '/r1(?:\s*)text(?:\s*)1(.*)<\/id>/s'

muhtemelen dize / dosyayı ayrıştırmak ve FONT etiketi arasında değer ayıklamak gerekir. Sonra id etiketi içine değer eklemek

Php ayrıştırma için googling deneyin.

Bu deneyin

preg_match('/r1text1(.*)<\/id\>/', $metadata], $matches);

Sen desen sınırlayıcı olarak / kullanıyorsunuz ama içerik olarak / var. Sen kaçış karakteri olarak \ kullanabilirsiniz.

Numunede size "r1 metin 1" var, henüz düzenli ifade "r1text1" vardır. Size karşı bu maç için çalışıyoruz dize boşluk vardır, çünkü normal ifade eşleşmiyor. Sen normal ifadede boşluk içermelidir.