Это mycode
<?php /** * @author Joomlacoders * @copyright 2010 */ $url="http://urlchecker.net/html/demo.html"; $innerHtml=file_get_contents($url); //echo $innerHtml; preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches); //<div id='news-id-160346'> var_dump($matches); ?>
Я хочу найти весь контент в div id = 'news-id-160346'. пожалуйста, помогите мне
Используйте парсер HTML. НЕ регулярные выражения.
Проблема с регулярными выражениями заключается в том, что они не могут соответствовать вложенным структурам. Предполагая, что ваше регулярное выражение должно совпадать с одним <div>
и его закрывающим тегом, нет правильного соответствия этому вводу:
<div id="a"> <div id="b"> Foo </div> </div> <div id="c"> Bar </div>
Поскольку, если ваше регулярное выражение является жадным, оно будет соответствовать двум верхним div, и если оно неровно, оно не будет соответствовать правильному тегу конца.
Поэтому вы должны использовать парсер HTML. С PHP, DOMDocument::loadHTML
или DOMDocument::loadHTMLFile
каждый делает довольно хорошую работу. (Вы можете «безопасно» игнорировать предупреждения, которые он создает: они только ошибки разметки, а сгенерированный объект DOMDocument
должен быть в порядке.)
Поскольку PHP getElementById – это боль, чтобы работать, вы можете использовать DOMXpath для той же цели:
<?php $url = "http://urlchecker.net/html/demo.html"; $d = new DOMDocument(); $d->loadHTMLFile($url); $xpath = new DOMXPath($d); $myNews = $xpath->query('//@id="news-id-160346"')->item(0); ?>
Используйте синтаксический анализатор, как предложили другие.
Или попробуйте это регулярное выражение:
preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches); print_r($matches);
Проверьте вывод инструкции print_r
чтобы понять, почему regex не рассматривается как правильный инструмент для анализа html.