PHP/regex:如何获取 HTML 标签的字符串值?

Posted

技术标签:

【中文标题】PHP/regex:如何获取 HTML 标签的字符串值?【英文标题】:PHP/regex: How to get the string value of HTML tag? 【发布时间】:2010-10-24 03:40:45 【问题描述】:

我需要关于正则表达式或preg_match 的帮助,因为我在这方面还没有那么丰富的经验,所以这是我的问题。

我需要获取值“get me”,但我认为我的函数有错误。 html标签的数量是动态的。它可以包含许多嵌套的 html 标记,例如粗体标记。此外,“get me”的价值是动态的。

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

【问题讨论】:

Can you provide some examples of why it is hard to parse XML and HTML with a regex?的可能重复 RegEx match open tags except XHTML self-contained tags的可能重复 【参考方案1】:
<?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;
?>

这应该可以解决问题

【讨论】:

开始标签应该使用 或 ]*> 来匹配,而不是 。事实上,它是贪婪的,并且如果字符串中有多个结束标记,匹配的范围会比您希望的要大得多。 请注意,属性值可能包含一个普通的&gt; 只有在同一行只有一个$tagname 类型的标签时才有效。如果有多个标签,它将抓住它们的开始到结束。如果标签分布在多行上,这也不起作用。【参考方案2】:

试试这个

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

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

print_r($foo[1]);

【讨论】:

是的,我知道,但上一个答案不是 100% 正常工作。昨天我遇到了同样的问题,我尝试了上一个答案,但它们只显示一个标签值而不是下一个标签。我有更正此错误并为新用户提交正确答案。【参考方案3】:

在您的模式中,您只想匹配两个标签之间的所有文本。因此,您可以使用例如[\w\W] 来匹配所有字符。

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

【讨论】:

【参考方案4】:

由于属性值可能包含一个普通的&gt; 字符,试试这个正则表达式:

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

但是正则表达式不适合解析 HTML 等非常规语言。您最好使用 SimpleXML 或 DOMDocument 之类的解析器。

【讨论】:

【参考方案5】:

这可能是旧的,但我的回答可能会帮助某人

你可以简单地使用

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

https://www.php.net/manual/en/function.strip-tags.php

【讨论】:

【参考方案6】:
$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
    

【讨论】:

【参考方案7】:

试试$pattern = "&lt;($tagname)\b.*?&gt;(.*?)&lt;/\1&gt;"return $matches[2]

【讨论】:

感谢您发布此问题的答案!在 Stack Overflow 上不鼓励仅使用代码的答案,因为没有上下文的代码转储无法解释解决方案的工作方式或原因,这使得原始发布者(或任何未来的读者)难以理解其背后的逻辑。请编辑您的问题并包含对您的代码的解释,以便其他人可以从您的回答中受益。谢谢!【参考方案8】:

以下 php sn-ps 将返回 html 标签/元素之间的文本。

regex : "/tagname(.*)endtag/" 将返回标签之间的文本。

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

它将返回“一些文本”。

【讨论】:

【参考方案9】:

你的 HTML

$html='<ul id="main">
    <li>
        <h1><a href="[link]">My Title</a></h1>
        <span class="date">Date</span>
        <div class="section">
            [content]
        </div>
    </li>
</ul>';

//函数调用可以改变标签名

echo contentBetweenTags($html,"span");

// 这个函数将帮助你从特定标签中获取数据

function contentBetweenTags($content, $tagname)
    $pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s";
    preg_match($pattern, $content, $matches);
    
    if(empty($matches))
        return;
    
    $str = "<$tagname>".html_entity_decode($matches[1])."</$tagname>";
    return $str;

【讨论】:

以上是关于PHP/regex:如何获取 HTML 标签的字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

PHP/REGEX:获取括号内的字符串

如何从html字符串中获取头部和身体标签作为字符串?

如何从php中的字符串获取html标签?

awk 如何获取每行最后一个字符

如何解析图像标签的 HTML 字符串以获取 SRC 信息?

PHP regex-从字符串中删除特殊字符