Как удалить данные из тегов HTML - PullRequest
6 голосов
/ 13 июля 2009

Скажите, у меня есть такие данные:

<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».

Спасибо за помощь!

UPDATE: Чтобы мне было понятнее - я использую filegetcontents (), чтобы получить html с сайта. В моих целях я хотел бы иметь возможность сортировать html, находить значения параметров и выводить их. В этом случае верните «Test - 123», «Test - 456» и т. Д.

Ответы [ 6 ]

3 голосов
/ 13 июля 2009

Есть много способов, и лучший из них зависит от большего количества деталей, чем вы указали в своем вопросе.
Одна возможность: DOMDocument и 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 голос
/ 13 июля 2009

Если вы не просто перелом, подобный упомянутому, используйте реальный анализатор, такой как DOMDocument , через который вы можете пройти с помощью DOMXPath .

В противном случае попробуйте это регулярное выражение вместе с preg_match_all:

<option(?:[^>"']+|"[^"]*"|'[^']*')*>([^<]+)</option>
1 голос
/ 13 июля 2009

Этот код будет загружать значения в массив, предполагая, что у вас есть разрывы строк между тегами параметров, как вы показали:

// 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));
0 голосов
/ 13 июля 2009

Если мы делаем регулярные выражения, мне нравится этот 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");'
0 голосов
/ 13 июля 2009

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

preg_match_all("s/<[a-zA-Z\/][^>]*>//g", $data, $out);
0 голосов
/ 13 июля 2009

Использование 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...