2009-05-06 15 views
29

Ho bisogno di aiuto su regex o preg_match perché non sono ancora così esperto riguardo a quelli così qui è il mio problema.PHP/regex: come ottenere il valore stringa del tag HTML?

Ho bisogno di ottenere il valore "get me" ma penso che la mia funzione abbia un errore. Il numero di tag html è dinamico. Può contenere molti tag html nidificati come un tag grassetto. Inoltre, il valore "get me" è dinamico.

<?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

possibile duplicato di [Potete fornire alcuni esempi del perché è difficile analizzare XML e HTML con una regex?] (Http: //stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-rege) –

+0

possibile duplicato di [RegEx match open tag tranne tag XHTML autonomi] (http://stackoverflow.com/questions/1732348/regex-match-open-ta gs-except-xhtml-self-contained-tags) –

risposta

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; 
?> 

Questo dovrebbe fare il trucco

+1

Il tag di apertura deve essere abbinato usando <$tagname.*?> o <$tagname[^>] *>, non <$ tagname?. *>. Così com'è, è avido e si abbina molto più di quanto speravi se c'è più di un tag di chiusura nella stringa. –

+0

Questo ha funzionato. Grazie mille takete.dk: D – marknt15

+0

@Samir: Grazie per il suggerimento, ci proverò. – marknt15

8

nel vostro modello, si vuole semplicemente abbinare tutto il testo tra i due tag. Pertanto, è possibile utilizzare ad esempio uno [\w\W] per abbinare tutti i caratteri.

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

grazie ... fantastico – mostafaznv

0

I seguenti frammenti di codice PHP restituiscono il testo tra tag/elementi HTML.

regex: "/tagname(.*)endtag/" restituirà il testo tra i tag.

cioè


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

Si tornerà "SOME TEXT".

saluti,

Web-Farmer @ letsnurture.com

2

Poiché i valori degli attributi possono contenere una pianura > carattere, provare questa espressione regolare:

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

Ma le espressioni regolari non sono adatti per l'analisi di linguaggi non regolari come HTML. È meglio usare un parser come SimpleXML o DOMDocument.

8

Prova questa

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

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

print_r($foo[1]); 
+6

sì lo so ma la risposta precedente non funziona al 100% correttamente.ieri ho lo stesso problema e provo la risposta precedente ma mostrano solo un valore di tag che non va al tag successivo. Ho corretto questo errore e invio la risposta corretta per i nuovi utenti. – 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

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

+0

Grazie per aver postato una risposta a questa domanda! Le risposte al solo codice sono scoraggiate su Stack Overflow, perché un dump del codice senza contesto non spiega come o perché la soluzione funzionerà, rendendo difficile per il poster originale (o per eventuali futuri lettori) capire la logica alla base. Per favore, modifica la tua domanda e includi una spiegazione del tuo codice in modo che gli altri possano beneficiare della tua risposta. Grazie! –

Problemi correlati