2009-05-06 14 views
29

Regex veya preg_match hakkında yardıma ihtiyacım var çünkü henüz bu konuda deneyimli değilim, işte benim sorunum.PHP/regex: HTML etiketinin dize değeri nasıl alınır?

"Beni al" değerini almam gerekiyor, ancak işlevimin bir hatası olduğunu düşünüyorum. html etiketlerinin sayısı dinamiktir. Kalın bir etiket gibi birçok yuvalanmış html etiketi içerebilir. Ayrıca, "get me" değeri dinamiktir. senin desen olarak hile

+0

olası yinelenen: //stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-rege) –

+0

olası kopyası [RegEx, XHTML bağımsız etiketler hariç açık etiketleri eşleştir] (http://stackoverflow.com/questions/1732348/regex-match-open-ta gs-except-xhtml-kendi içinde bulunan etiketler) –

cevap

58
<?php 
function getTextBetweenTags($string, $tagname) { 
    $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
} 

$str = '<textformat leading="2"><p align="left"><font size="10">get me</font></p></textformat>'; 
$txt = getTextBetweenTags($str, "font"); 
echo $txt; 
?> 

, sadece iki etiketin arasına tüm metin eşleştirmek istiyoruz. Böylece, tüm karakterleri eşleştirmek için örneğin bir [\w\W] kullanabilirsiniz.

function getTextBetweenTags($string, $tagname) { 
    $pattern = "/<$tagname>([\w\W]*?)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
} 
+1

Açılış etiketi, <$tagname.*?> veya <$tagname[^>] *> ile değil, <$ tagname?. *> ile eşleştirilmelidir. Olduğu gibi, açgözlü ve dizede birden fazla kapanış etiketi varsa umduğundan çok daha fazla eşleşecektir. –

+0

Bu çalıştı. Çok teşekkürler takete.dk: D – marknt15

+0

@Samir: Bahşiş için teşekkürler, deneyeceğim. – marknt15

8

yapmalıyım

<?php 
function getTextBetweenTags($string, $tagname) { 
    $pattern = "/<$tagname>(.*?)<\/$tagname>/"; 
    preg_match($pattern, $string, $matches); 
    return $matches[1]; 
} 

$str = '<textformat leading="2"><p align="left"><font size="10">get me</font></p></textformat>'; 
$txt = getTextBetweenTags($str, "font"); 
echo $txt; 
?> 
+0

teşekkürler ... harika – mostafaznv

0

Aşağıdaki php parçacıkları metni html etiketleri/öğeleri arasında döndürür.

regex: "/tagname(.*)endtag/" etiketleri arasındaki metni döndürecektir.

yani


$regex="/[start_tag_name](.*)[/end_tag_name]/"; 
$content="[start_tag_name]SOME TEXT[/end_tag_name]"; 
preg_replace($regex,$content); 

Bu "bir metin" döndürecektir.

Selamlar,

Web Çiftçi @ letsnurture.com

2

atıf değerleri düz > karakteri bulunabileceğinden, bu normal ifade deneyin:

$pattern = '/<'.preg_quote($tagname, '/').'(?:[^"'>]*|"[^"]*"|\'[^\']*\')*>(.*?)<\/'.preg_quote($tagname, '/').'>/s'; 

Ama düzenli ifadeler uygun değildir HTML gibi normal olmayan dilleri ayrıştırmak için. SimpleXML veya DOMDocument gibi bir ayrıştırıcı kullanmalısınız.

8

bu

$str = '<option value="123">abc</option> 
     <option value="123">aabbcc</option>'; 

preg_match_all("#<option.*?>([^<]+)</option>#", $str, $foo); 

print_r($foo[1]); 
+6

evet biliyorum ama önceki cevap% 100 doğru çalışmıyor.dün aynı sorunu yaşıyorum ve önceki cevabı deneyin ama bir sonraki etikete gitmeden sadece bir etiket değeri gösteriyorlar. Bu hatayı doğru düzelttim ve yeni kullanıcılar için doğru cevabı verdim. – pkwebmarket

0
$userinput = "http://www.example.vn/"; 
//$url = urlencode($userinput); 
$input = @file_get_contents($userinput) or die("Could not access file: $userinput"); 
$regexp = "<tagname\s[^>]*>(.*)<\/tagname>"; 
//==Example: 
//$regexp = "<div\s[^>]*>(.*)<\/div>"; 

if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) { 
    foreach($matches as $match) { 
     // $match[2] = link address 
     // $match[3] = link text 
    } 
} 
0

$pattern = "<($tagname)\b.*?>(.*?)</\1>" ve return $matches[2] deneyin deneyin

[bunu bir regex ile XML ve HTML ayrıştırmak zordur neden bazı örnekler verebilir misiniz?] (Http
+0

Bu soruya cevap gönderdiğiniz için teşekkür ederiz! Yığın Taşması'nda yalnızca kod yanıtları kaldırılmaz, çünkü bağlam olmayan bir kod dökümü, çözümün nasıl veya neden işe yaradığını açıklamamakta, orijinal posterin (veya gelecekteki okuyucuların) arkasındaki mantığı anlamasını zorlaştırmaktadır. Lütfen, sorunuzu düzenleyin ve kodunuzun açıklamasını ekleyin, böylece diğer kişiler cevabınızdan yararlanabilir. Teşekkürler! –

İlgili konular