2013-06-25 4 views
-2

Так что это часть контента HTML, из которого я выскабливание:PHP регулярных выражений динамических строк

<div class="sms-separator"></div> 
<div class="wallpaper-ads-right"> 
    <b>Wallpaper:</b> 
    Rayman Legends Game sms<br /> 
    <b>Categories: </b> 
    <a href="/games-desktop-wallpapers.html" title="Games wallpapers"> Games</a> 
    <br /><b> 

Что мне нужно, чтобы получить текст вместо «игры» на странице обновления он будет как

<div class="sms-separator"></div> 
<div class="wallpaper-ads-right"> 
    <b>Wallpaper:</b> 
     Souya ssss<br /> 
    <b>Categories: </b> 
     <a href="/soutss-tourguides" title="Tour"> Tourist</a><br /><b> 

Теперь из приведенного выше содержания, я хочу, чтобы очистить «Турист»

проблема заключается в A HREF и тег заголовка до того, что есть динамическое содержимое, они различаются в зависимости от страницы к странице, так как я могу положить, что в Regu lar Expression?

+0

Итак, другими словами, вы хотите содержимое 'href' тег, который непосредственно следует за' Категории: '? –

+3

Почему бы не использовать настоящий парсер для этого, как DOM? Разбор html с regexpes [не подходит для вас] (http://stackoverflow.com/a/1732454/1515540). – complex857

+0

Анализ HTML с регулярными выражениями [обычно рассматривается сверху вниз] (http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html). Есть более надежные решения. Вы открыты к этим? – FakeRainBrigand

ответ

0

Описание

Это выражение будет захватить заголовок раздела и HREF & название каждой ссылки. Я оставил это как многострочное выражение, чтобы помочь с удобочитаемостью. Многопоточный регулярное выражение действительно требуют x игнорировать пробелы в варианте шаблон

<b>[\w\s]+:\s*<\/b>.*? 
<a\b(?=\s) 
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=('[^']*'|"[^"]*"|[^'"][^\s>]*)) 
(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\stitle=('[^']*'|"[^"]*"|[^'"][^\s>]*)) 

enter image description here

Expanded

  • <b>[\w\s]+:\s*<\/b>.*? находит заголовок категоризации: и захватывает текст перед матчем :
  • <a\b(?=\s) под открытым небом якорная бирка
  • (?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=('[^']*'|"[^"]*"|[^'"][^\s>]*)) собирает значение HREF, обратите внимание на дополнительный пух здесь, чтобы предотвратить нечетные случаи краев и позволяет атрибуту появляться в любом порядке внутри тега
  • (?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\stitle=('[^']*'|"[^"]*"|[^'"][^\s>]*)) собирает значение заголовка, так же пушок, как и в HREF матча над

PHP Пример кода:

Ввод текста

<div class="sms-separator"></div> 
<div class="wallpaper-ads-right"> 
    <b>Wallpaper:</b> 
    Rayman Legends Game sms<br /> 
    <b>Categories: </b> 
    <a href="/games-desktop-wallpapers.html" title="Games wallpapers"> Games</a> 
    <br /><b> 
<div class="sms-separator"></div> 
<div class="wallpaper-ads-right"> 
    <b>Wallpaper:</b> 
     Souya ssss<br /> 
    <b>Categories: </b> 
     <a href="/soutss-tourguides" title="Tour"> Tourist</a><br /><b> 

Код

<?php 
$sourcestring="your source string"; 
preg_match_all('/<b>([\w\s]+):\s*<\/b>[\s\r\n]*? 
<a\b(?=\s) 
(?=(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\shref=(\'[^\']*\'|"[^"]*"|[^\'"][^\s>]*)) 
(?=(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\stitle=(\'[^\']*\'|"[^"]*"|[^\'"][^\s>]*))/imsx',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

Матчи

$matches Array: 
(
    [0] => Array 
     (
      [0] => <b>Categories: </b> 
    <a 
      [1] => <b>Categories: </b> 
     <a 
     ) 

    [1] => Array 
     (
      [0] => Categories 
      [1] => Categories 
     ) 

    [2] => Array 
     (
      [0] => "/games-desktop-wallpapers.html" 
      [1] => "/soutss-tourguides" 
     ) 

    [3] => Array 
     (
      [0] => "Games wallpapers" 
      [1] => "Tour" 
     ) 

) 
0
<?php 
while ($line = fgets(STDIN)) 
    if (preg_match('?<a href=".*" title=".*">(.*)</a>?', $line, $match)) 
     echo $match[1], "\n"; 
?>