Php 如何从HTML标记中剥离数据

Php 如何从HTML标记中剥离数据,php,html,regex,Php,Html,Regex,假设我有这样的数据: <option value="abc" >Test - 123</option> <option value="def" >Test - 456</option> <option value="ghi" >Test - 789</option> Test-123 测试-456 测试-789 使用PHP,我将如何对HTML标记进行排序,从选项值中返回所有文本。例如,给定上面的代码,我想返回'Test-

假设我有这样的数据:

<option value="abc" >Test - 123</option>
<option value="def" >Test - 456</option>
<option value="ghi" >Test - 789</option>
Test-123
测试-456
测试-789
使用PHP,我将如何对HTML标记进行排序,从选项值中返回所有文本。例如,给定上面的代码,我想返回'Test-123','Test-456','Test-789'

谢谢你的帮助

更新:
这样我就更清楚了——我使用filegetcontents()从站点获取html。出于我的目的,我希望能够对html进行排序,找到选项值并输出它们。在这种情况下,除非我误解了问题,否则请使用
strip\u标签返回“Test-123”、“Test-456”等

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

    $string = strip_tags($string);
$string='Test-123
测试-456
测试-789';
$string=带标签($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);
$teststring='Test-123
测试-456
测试-789';
$stringarray=split(“\n”,strip_标记($teststring));
打印(字符串数组);
更新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";
$teststring='Test-123
测试-456
测试-789';
$stringarray=split(“\n”,strip_标记($teststring));
$newstring=join($stringarray,“,”);
回显“'”$newstring。“\n”;

此代码将把值加载到数组中,假设选项标记之间有换行符,如图所示:

// 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));
//将HTML加载到字符串中。

$html=有很多方法,哪种方法最好取决于您在问题中提供的更多细节。
一种可能性:


如果您不只是像上面提到的那样有一个断开,那么请使用一个真正的解析器,这样您就可以轻松地使用它了

否则,请将此正则表达式与
preg\u match\u all
一起尝试:

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

preg\u match\u all(“s/]*>//g”,$data,$out);

如果我们在做正则表达式的东西,我喜欢这种类似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");'
$test=“test-123\n”。
“测试-456\n”。
“测试-789\n”;

对于($offset=0;preg_match(“/]*>”([^option元素的value属性定义为CDATA。如果我没有弄错,它允许是,它允许:-)使用正则表达式,它很容易编写一些简单的东西来处理常见的用例(也很容易阅读),但要编写能够正确解析XML等结构化语言的东西是非常困难的“解析器,使用理解DOM或SAX等语言的语言。缺点是对于简单的情况,DOM和SAX更难编写和读取。这可能是sed的有效模式,但不适用于php的preg_match_all。
<option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option>
preg_match_all("s/<[a-zA-Z\/][^>]*>//g", $data, $out);
$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");'