web-dev-qa-db-fra.com

PHP/regex: Comment obtenir la valeur de chaîne d'une balise HTML?

J'ai besoin d'aide sur regex ou preg_match parce que je ne suis pas encore expérimenté en ce qui concerne ces problèmes, voici donc mon problème.

Je dois obtenir la valeur "get me" mais je pense que ma fonction a une erreur . Le nombre de balises html est dynamique. Il peut contenir plusieurs balises HTML imbriquées, comme une balise gras. En outre, la valeur "get me" est dynamique.

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

Cela devrait faire l'affaire

64
takete.dk

Essaye ça 

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

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

print_r($foo[1]);
9
pkwebmarket

Dans votre modèle, vous voulez simplement faire correspondre tout le texte entre les deux balises. Ainsi, vous pouvez utiliser par exemple un [\w\W] pour faire correspondre tous les caractères.

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

Étant donné que les valeurs d'attribut peuvent contenir un caractère > simple, essayez cette expression régulière:

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

Mais les expressions régulières ne conviennent pas à l'analyse de langages non réguliers tels que HTML. Vous devriez mieux utiliser un analyseur tel que SimpleXML ou DOMDocument .

2
Gumbo
$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
Xman Classical

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

0
Darren Li

Les extraits de code php suivants renvoient le texte entre les balises/éléments HTML.

regex: "/tagname(.*)endtag/" retournera le texte entre les balises.

c'est à dire. 


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

Il retournera "QUELQUE TEXTE".

Cordialement,

Web-Farmer @ Letsnurture.com

0
Letsnurture