Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Найти весь текст в html


Автор: neoks 12.4.2013, 10:53
Забыл напрочь эти регулярные выражения и не могу теперь составить правильно, подскажите как можно вытащить только текст из html страницы.
Сейчас полагаю что будет много лишнего текст таких как скрипты, стили и тд, полагаю что нужно вытаскивать между определенными тегами.
Список тегов составить не проблема )) но не могу вытащить текст даже из определенного тега

Вот пример
Код

preg_replace_callback("/<a[^>]*>(.+?)</a>/si",'getTexts',$file);


Не знаю, и так и сяк не могу вытащить текст, подскажите как выдернуть только текст из тега

Пробовал еше такой вариант 

Код

preg_replace_callback("/<a[^>]*>(\w+)</a>/si",'getTexts',$file);


Вроде ему сказал вытаскивать только из тега <a> а он вытащил даже из тега <script> 

Подскажите что я неправильно делаю)

Автор: s0lman 12.4.2013, 11:08
Чтобы просто выдрать текст из ссылки подойдет
Код

/^\<a[^>]*>([^<]*)\<\/a>$/

Автор: neoks 12.4.2013, 11:20
Ну вот вроде нет нечего проше, но увы все также выдергивает все подряд, полюбе какой там я тег указал, ишет все хз почему ))

Автор: s0lman 12.4.2013, 11:44
пример исходного хтмл ?

Автор: neoks 12.4.2013, 13:54
Вот примерчик, к примеру не могу выдернуть из <th> ))
Код

function getTexts($a){
    echo $a[1];
}

$html = <<<HTML

<script type='text/javascript'>
/* <![CDATA[ */
    var dropdown = document.getElementById("cat");
    function onCatChange() {
        if ( dropdown.options[dropdown.selectedIndex].value > 0 ) {
            location.href = "/site/?cat="+dropdown.options[dropdown.selectedIndex].value;
        }
    }
    dropdown.onchange = onCatChange;
/* ]]> */
</script>

</li><li class="widgets"><h2 class="mainhead">&nbsp;</h2><div id="calendar_wrap"><table id="wp-calendar">
    <caption>Апрель 2013</caption>
    <thead>
    <tr>
        <th scope="col" title="Понедельник">Пн</th>
        <th scope="col" title="Вторник">Вт</th>
        <th scope="col" title="Среда">Ср</th>
        <th scope="col" title="Четверг">Чт</th>
        <th scope="col" title="Пятница">Пт</th>
        <th scope="col" title="Суббота">Сб</th>
        <th scope="col" title="Воскресенье">Вс</th>
    </tr>
    </thead>

    <tfoot>
    <tr>
        <td colspan="3" id="prev"><a href="_2013_03_" title="Просмотреть записи за Март 2013">&laquo; Март</a></td>
        <td class="pad">&nbsp;</td>
        <td colspan="3" id="next" class="pad">&nbsp;</td>
    </tr>
    </tfoot>

    <tbody>
    <tr><td><a hr
HTML;
preg_replace_callback("/^\<th[^>]*>([^<]*)\<\/th>$/",'getTexts',$html);

Автор: patap 12.4.2013, 18:58
ну ты совсем не то замутил с th

как-то так
Код

$html = preg_replace("/<th[^>]*>([^<]*)<\/th>/",'$1', $html);

Автор: s0lman 12.4.2013, 19:04
Так уберите из паттерна признаки начала и конца строки

Код

/\<th[^>]*>([^<]*)\<\/th>/


Добавлено через 35 секунд
patap, опередил)

Автор: neoks 12.4.2013, 21:12
я решил все таки обойтись другим вариантом, сначала спарсить все html теги и заменить типа ]0[ и затем спарсить текст в этих тегах ]0[ ну и сделать перевод и обратно вернуть теги, покамись все работает славно ))

Автор: cia 14.4.2013, 12:47
Цитата

Вроде ему сказал вытаскивать только из тега <a> а он вытащил даже из тега <script> 

(.+?) - это жадный паттерн, он заберёт всё по максимуму. Надо использовать (.*?) или так: ([^<]+)
s0lman правильно пишет, так будет работать, только угловые скобки экранировать не обязательно.

Автор: patap 16.4.2013, 19:08
Цитата(cia @  14.4.2013,  11:47 Найти цитируемый пост)
(.+?) - это жадный паттерн

он не жадный, он как минимум одно совпадение ожидает, в отличии от .*?, который - ноль и больше

а жадный .+ и .*

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)