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

mar*_*t15 35 html php regex

我需要有关正则表达式的帮助,或者preg_match因为我不是那么有经验但关于那些,所以这里是我的问题.

我需要获得值"得到我",但我认为我的函数有错误.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;
?>
Run Code Online (Sandbox Code Playgroud)

小智 67

<?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;
?>
Run Code Online (Sandbox Code Playgroud)

这应该够了吧

  • 请注意,属性值可能包含普通的`>`. (3认同)
  • 开始标记应使用<$ tagname.*?>或<$ tagname [^>]*>匹配,而不是<$ tagname?.*>.实际上,如果字符串中有多个结束标记,它会比你希望的更贪婪和匹配. (2认同)
  • 这仅适用于同一行中只有一个类型为`$ tagname`的标记.如果有多个标签,它将抓住它们的开头到结尾.如果标记分布在多行中,这也不起作用. (2认同)

pkw*_*ket 11

试试这个

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

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

print_r($foo[1]);
Run Code Online (Sandbox Code Playgroud)

  • 是的我知道,但前面的答案不是100%正常工作.昨天我有相同的问题,我尝试前一个答案,但他们只显示一个标签值不会到下一个标签.我已经纠正了这个错误并提交了正确的答案新用户. (6认同)

Tom*_*han 8

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

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