2010-03-11 4 views
0

Я пытаюсь использовать preg_replace, чтобы получить некоторые данные из удаленной страницы, но у меня немного вопроса, когда дело доходит до сортировки шаблона.preg_replace ад

function getData($Url){ 
    $str = file_get_contents($Url); 
    if(strlen($str)>0){ 
     preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\>(.*)\</div\></span\>/",$str,$title); 
     return $title[1]; 
    } 
} 

Вот HTML как прежде, чем я закончил тем, что бросил миллион слэш на него (похоже, что я забыл часть или два):

<span class="cell CellFullWidth"><span class="SectionHeader">mytitle</span><br/><div class="Center">Event Name</div></span> 

Где Имя события является данные, которые я хочу для возврата в мою функцию.

Большое спасибо, ребята, это боль в заднице.

+0

Я бы не касался этого десятифутовым столбом. Должен быть более эффективный способ получить название, чем сканирование всей страницы для соответствия. Вы знаете, что preg_match вернет массив, если он содержит более одного соответствия для этих критериев, правильно? – animuson

+0

Я хотел бы использовать HTML-парсер, такие как http://simplehtmldom.sourceforge.net/ – marvin

+0

Как так много раз, прежде чем на SO, я бы рекомендовал не использовать регулярные выражения для разбора HTML, так как они не подходят для этого. Вместо этого используйте парсер HTML. –

ответ

0

Хотя я склонен согласиться с комментаторами, что это не очень подходит, вот мой непроверенный пересмотр вашего заявления:

preg_match('#\<span class="SectionHeader"\>title\</span\>/\<br/\>/\<div class="header2"\>(.*)\</div\>\</span\>#',$str,$title); 

Я изменил двойных кавычках строки в одинарных кавычках, как вы Арен «т с использованием любой из функций переменной замещения строк в двойных кавычках, и это избавляет от необходимости обратной косой черты избежать двойные кавычки, а также избежать двусмысленности о слэш (которые, возможно, следовало бы удвоенную произвести соответствующие строки - см the php manual on strings). Я изменил слэш/разделители на хэш # из-за количества слэшей, появляющихся в шаблоне соответствия (некоторые из которых не были сбрасываются в вашей версии).

0

Есть довольно много вещей, не так с вашим выражением:

  • Вы используете / в качестве разделителя, но затем использовать / Unescaped в различных местах.
  • Вы спасаясь < и >, казалось бы, в случайном порядке. Им не следует избегать вообще.
  • У вас есть какие-то изгои / сек вокруг <br/> по какой-то причине.
  • Имя класса для DIV определяется как header2 в регулярном выражении, но Center в образце HTML
  • Название является mytitle в HTML и title в регулярном выражении

Со всеми из них исправлены, вы получить:

preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t); 

Если вы хотите, чтобы соответствовать любому заголовку вместо конкретного названия mytitle, просто заменить, что с .*?.

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