2013-11-21 1 views
0

У меня есть следующие данныеPHP рег ех, чтобы найти данные не в HTML-теги, но определить HTML с использованием < и >

<description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;&lt;span style="font-family: Georgia, Times New Roman, serif; font-size: xx-small;"&gt;By Marina Correa&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;i&gt;&lt;span style="font-family: Georgia, Times New Roman, serif; font-size: xx-small;"&gt;Photography: Courtesy the architect&lt;/span&gt;&lt;span style="font-family: Georgia, serif; font-size: 9pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-D1JRy4epwOM/UooCcR-U7lI/AAAAAAAALyM/tDr2ezxnb-I/s1600/Prost_Beer_+House_AH_Design_Indiaartndesign.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Prost Beer House in Bengaluru, India,by AH design." border="0" src="http://3.bp.blogspot.com/-D1JRy4epwOM/UooCcR-U7lI/AAAAAAAALyM/tDr2ezxnb-I/s1600/Prost_Beer_+House_AH_Design_Indiaartndesign.jpg" title=""&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: right;"&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: xx-small;"&gt;.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="MsoNormal"&gt;&lt;br&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Georgia, &amp;#39;Times New Roman&amp;#39;, serif;"&gt;Evolving from carnage of shipwrecked metal, the interiors of Prost Beer House in Bengaluru, India, make it an attention-grabbing drinking hole…&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;a href="http://inditerrain.indiaartndesign.com/2013/11/beerhouse-rock.html#more"&gt;Read more »&lt;/a&gt;&lt;img src="http://feeds.feedburner.com/~r/IndiaArtNDesign/~4/jGC75D3KB0o" height="1" width="1"/&gt;</description>

однако вместо «<» я есть «& л;» и вместо «>» у меня есть «&»;

мне нужно регулярное выражение, чтобы найти данные не внутри HTML-теги, то есть сам текст, а не имена тегов, имя класса и т.д. ...

для разбора HTML с «<» и " > «Я нашел это: (? < =^|>) [^> <] +? (? = < | $)

хотя я не знаю, как его преобразовать в соответствии с тем, что мне нужно. помощь очень ценится

+0

[html_entity_decode();] (http://us3.php.net/html_entity_decode) и/или [htmlspecialchars_decode();] (http://php.net/manual/en/function.htmlspecialchars-decode.php), затем используйте DOM-парсер для получения ваших данных. –

ответ

0

Чтобы быстро получить необработанный текст (без тегов), вы можете сделать эту замену:

$result = preg_replace('~&lt;.*?&gt;~s', ' ', $source); 
+0

источник и результат выводятся точно так же, попробовав это. Может ли, пожалуйста, объяснить регулярное выражение? – user2296208

0

Это дает вам все тексты, которые вы ищете в виде массива:

preg_match_all("/(?<=&gt;)(?!&lt;).*?(?=&lt;)/", $source, $result); 

См. live demo этого регулярного выражения, работающего с вашим образцом ввода.

1

Это выглядит как фрагмент HTML внутри XML, более конкретный внутри описания RSS-канала. Если это так, вы должны разобрать RSS с помощью DOM, это будет декодировать ПРИМИТИВЫ длинный путь:

$dom = new DOMDocument(); 
$dom->loadXml($rss); 
$xpath = new DOMXpath($dom); 

итерацию элементы:

foreach ($xpath->evaluate('/rss/channel/item') as $rssItem) { 

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

echo 'Title: ', $xpath->evaluate('string(title)', $rssItem), "\n"; 

описание в вашем примере содержит фрагмент HTML в текстовом узле с сбежавших лиц, я видел другой пример с CDATA. Это не имеет большого значения для внешнего XML-документа. Это текст, и если вы читаете как текст, объекты будут преобразованы обратно в соответствующие символы.

$description = $xpath->evaluate('string(description)', $rssItem); 

Так что теперь описание $ < и> снова. Он может быть загружен в DOM с loadHtml() или просто очищен с помощью strip_tags().

echo 'Description: ', strip_tags($description), "\n\n"; 

Полный пример (RSS адаптировано из Wikipedia):

$rss = <<<'RSS' 
<?xml version="1.0" encoding="UTF-8" ?> 
<rss version="2.0"> 
<channel> 
<item> 
    <title>Example entry</title> 
    <description>Here is some &lt;b&gt;text&lt;/b&gt; containing an interesting &lt;i&gt;description&lt;/i&gt; with &lt;span class="important"&gt;html&lt;/span&gt;.</description> 
</item> 
</channel> 
</rss> 
RSS; 

$dom = new DOMDocument(); 
$dom->loadXml($rss); 
$xpath = new DOMXpath($dom); 

foreach ($xpath->evaluate('/rss/channel/item') as $rssItem) { 
    echo 'Title: ', $xpath->evaluate('string(title)', $rssItem), "\n"; 
    $description = $xpath->evaluate('string(description)', $rssItem); 
    echo 'Description: ', strip_tags($description), "\n\n"; 
} 

Выход:

Title: Example entry 
Description: Here is some text containing an interesting description with html. 
+0

+1 ** Это ** - единственный способ получить прибыль ... Два года с тех пор [этот пост] (http://stackoverflow.com/a/1732454/383793) и * еще * так много вопросов с обоими [ тег: xml] * и * [тег: regex]. –

Смежные вопросы