如何从HTML标记中删除数据

时间:2009-07-12 20:34:01

标签: php html regex

说我有这样的数据:

<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>

使用PHP,我如何对HTML标记进行排序,从选项值中返回所有文本。例如,根据上面的代码,我想返回'Test - 123','Test - 456','Test - 789'。

感谢您的帮助!

更新 所以我更清楚 - 我正在使用filegetcontents()从网站获取html。出于我的目的,我希望能够对html进行排序,找到选项值并输出它们。在这种情况下,返回'测试 - 123','测试 - 456'等

6 个答案:

答案 0 :(得分:3)

有很多方法,其中一种方法最好取决于你提出的更多细节 一种可能性:DOMDocument and DOMXPath

<?php
$doc = new DOMDocument;
$doc->loadhtml('<html><head><title>???</title></head><body>
  <form method="post" action="?" id="form1">
      <div>
        <select name="foo">
        <option value="abc" >Test - 123</option>
        <option value="def" >Test - 456</option>
        <option value="ghi" >Test - 789</option>
      </select>
    </div>
  </form>
</body></html>');

$xpath = new DOMXPath($doc);
foreach( $xpath->query('//form[@id="form1"]//option') as $o) {
    echo 'option text: ', $o->nodeValue, "  \n";
}

打印

option text: Test - 123  
option text: Test - 456  
option text: Test - 789  

答案 1 :(得分:1)

此代码会将值加载到数组中,假设您在所显示的选项标记之间有换行符:

// Load your HTML into a string.
$html = <<<EOF
<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>
EOF;

// Break the values into an array.
$vals = explode("\n", strip_tags($html));

答案 2 :(得分:1)

如果您不仅仅是像上面提到的那样的破裂,请使用像DOMDocument这样的真实解析器,您可以使用DOMXPath来完成。

否则请与preg_match_all一起尝试此正则表达式:

<option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option>

答案 3 :(得分:0)

使用strip_tags,除非我误解了这个问题。

    $string = '<option value="abc" >Test - 123</option>
    <option value="def" >Test - 456</option>
    <option value="ghi" >Test - 789</option>';

    $string = strip_tags($string);

更新:错过了您在问题中松散指定数组。在这种情况下,我确信有一个更干净的方法,我会做类似的事情:

$teststring = '<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>';

$stringarray = split("\n", strip_tags($teststring));
print_r($stringarray);

更新2:并且只是顶部和尾部,按照您最初的要求呈现它(不是我们可能被误导相信的数组,请尝试以下操作:

$teststring = '<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>';

$stringarray = split("\n", strip_tags($teststring));

$newstring = join($stringarray, "','");
echo "'" . $newstring . "'\n";

答案 4 :(得分:0)

http://networking.ringofsaturn.com/Web/removetags.php

preg_match_all("s/<[a-zA-Z\/][^>]*>//g", $data, $out);

答案 5 :(得分:0)

如果我们正在做正则表达式的东西,我喜欢这种类似perl的语法:

$test = "<option value=\"abc\" >Test - 123</option>\n" .
    "<option value=\"abc\" >Test - 456</option>\n" .
    "<option value=\"abc\" >Test - 789</option>\n"; 

for ($offset=0; preg_match("/<option[^>]*>([^<]+)/",$test, $matches, 
                        PREG_OFFSET_CAPTURE, $offset); $offset=$matches[1][1])
   print($matches[1][0] . "\n");'