Поиск строки PHP - PullRequest
       2

Поиск строки PHP

2 голосов
/ 24 марта 2011

Я немного борюсь с PHP.

Я создал массив и заполнил несколько позиций некоторыми возвращаемыми данными curl.

Я не вижу, как бы я искал каждую позицию массива для <p><strong> и возвращал бы каждый символ от этого до </p>.

Из терминала я мог бы сделать что-то вроде этого:

grep -A 2 strong | sed -e 's/<p><strong>//' -e 's/<\/strong><br\/>//' -e 's/<br \/>//' -e 's/<\/p>//' -e 's/--//' -e 's/^[ \t]*//;s/[ \t]*$//'

но я теряюсь, делая это в PHP

любой совет?

Редактировать: я хочу, чтобы содержимое каждого <p><strong> </p>

Редактировать 2: Вот код, который я пытаюсь:

    $m=array();
preg_match_all('/<p><strong>(.*?)<\/p>/',$buffer,$m);
$sizeM = count($m);

for ( $counter2 = 0; $counter2 <= $sizeM; $counter2++)
{
    $displayString.= $m[$counter2];
}

И получение ArrayArrayArray ... как мой$ displayString

Редактировать 3: Я делаю это:

$curl_handle=curl_init();
curl_setopt($curl_handle,CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.04 (lucid) Firefox/3.6.15");
curl_setopt($curl_handle, CURLOPT_HEADER, 0);
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1);

$buffer = curl_exec($curl_handle);

curl_close($curl_handle);

$m=array();
preg_match_all('/<p>.*?<strong>(.*?)<\/p>/i',$buffer,$m);

foreach($m[1] as $mnum=>$match) {
    $displayString.='Match '.$mnum.' is: '.$match."\n";
}

Ответы [ 5 ]

2 голосов
/ 24 марта 2011

В PHP и многих других языках предпочитается не использовать строковые функции или регулярные выражения для соответствия HTML, поскольку HTML не является регулярным и может привести к серьезным ошибкам.

То, на что вы должны обратить внимание, - это система DOM, в которой вы можете перебирать html как объект, точно так же, как JavaScript обращается к DOM.

Для начала вам следует обратиться к следующей собственной библиотеке PHP: http://php.net/manual/en/class.domdocument.php

Вы можете просто использовать так:

$xml = new DOMDocument();

// Load the url's contents into the DOM 
$xml->loadHTMLFile($url); 

//Loop through each <a> tag in the dom and add it to the link array 
foreach($xml->getElementsByTagName('a') as $link)
{
    echo $link->href . "\n";
} 

и все ссылки в документе будут найдены.

Также, пожалуйста, смотрите статью, которую я создал, и отличный ответ Гордона: Как вы анализируете и обрабатываете HTML / XML в PHP?

2 голосов
/ 24 марта 2011

preg_match_all ()

$m=array();
preg_match_all('/<p>\s*<strong>([\s\S]*?)<\/p>/i',$string,$m);
foreach($m[1] as $mnum=>$match){
    $displayString.='Match '.$mnum.' is: '.$match."\n";
}

$m теперь содержит все совпадения. $m[0] содержит все совпадения, $m[1] содержит круглые скобки

1 голос
/ 24 марта 2011

Как указывалось в других публикациях, если вы пытаетесь обрабатывать HTML, вам не следует использовать регулярные выражения.

Для обработки поиска <p><strong> вы можете использовать DOMDocument :

$doc = new DOMDocument();
$doc->loadHTML($html);
$pTags = $doc->getElemetsByTagName('p');
for ($pTags as $pTag) {
  if ($pTag->firstChild->nodeName === 'strong') {
    $data = $pTag->firstChild->nodeValue;
  }
}

Или используйте XPath :

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$matchingNodes = $xpath->query('//p/strong');

или вы можете использовать экспат.

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

Мой личный фаворит для извлечения данных из документов в стиле XML - это xpath. Вот хороший набор примеров xpath: http://msdn.microsoft.com/en-us/library/ms256086.aspx

Edit: * Примечание: если вы пытаетесь обрабатывать очень большие документы XML / HTML, вы не захотите использовать DOMDocument или XPath, поскольку они могут быть медленными для больших документов. Для этих случаев используйте управляемый событиями анализатор XML. У нас были случаи, когда анализ большого XML-файла с помощью XPath занимал несколько минут, а анализ того же файла с помощью анализатора, управляемого событиями, - всего несколько секунд.

0 голосов
/ 24 марта 2011

Что ж, если позиции не имеют отношения к ожидаемому результату, вы можете попробовать объединить массив в одну строку и выполнить там регулярное выражение ...

Вот код

    <?php

$data = array(
    'DONT MATCH THISDONT MATCH THIS<p><strong>hello1!</strong></p>DONT MATCH THISDONT MATCH THISDONT MATCH THIS',
    'DONT MATCH THISDONT MATCH THIS<p><strong>hello2!</strong></p>DONT MATCH THISDONT MATCH THISDONT MATCH THIS',
    'DONT MATCH THISDONT MATCH THIS<p><strong>hello3!</strong></p>DONT MATCH THISDONT MATCH THISDONT MATCH THIS',
    '<p><strong>hello4!</strong></p>DONT MATCH THISDONT MATCH THIS<p><strong>hello5!</strong> test test</p>DONT MATCH THISDONT MATCH THISDONT MATCH THIS',
    'DONT MATCH THISDONT MATCH THIS<p><strong>hello6!</strong></p>DONT MATCH THISDONT MATCH THISDONT MATCH THIS',
);

preg_match_all('/<p><strong>.*?<\/p>/',implode($data,''),$results);

print_r($results);


?>

Дайте мне знать, если это работает для вас.Ура! * * 1006

0 голосов
/ 24 марта 2011

Регулярные выражения будут вашим другом здесь. strpos, substr и explode являются полезными функциями php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...