Получить текст между тегами A - PullRequest
0 голосов
/ 09 января 2010

Я пытаюсь получить текст ссылки из файла HTML. К каждой ссылке применяется определенный класс, но URL-адреса различны.

У меня есть следующее:

...
<a class="fetch-me" href="products/1">Find ME!!!</a>
...
<a class="fetch-me" href="products/2">Me too!</a>
...

Я использую следующий код PHP, но всегда получаю больше, чем хочу:

preg_match_all('<a class="fetch-me" href=".*">(.*)</a>)siU', $string, $matching_data);

Ответы [ 5 ]

3 голосов
/ 09 января 2010
<?php

$str = '
<a class="fetch-me" href="products/1">Find ME!!!</a>
...
<a class="fetch-me" href="products/2">Me too!</a>
';

$doc = new DOMDocument();
$doc->loadHTML($str);
$xp = new DOMXpath($doc);
$query = $xp->evaluate('//a[@class="fetch-me"]');

if ( $query->length > 0 ) {
    foreach ($query as $anchor ) {
    echo $anchor->nodeValue . '<br>';
    }
}

Вы также можете использовать @contains в сочетании с @class, если значения нескольких классов имеют значение, вы всегда можете использовать абстрактную оболочку высокого уровня для DOM.

0 голосов
/ 09 января 2010

Я перепробовал все эти ответы, и все, вероятно, правы. Я собираюсь сделать рефакторинг, чтобы использовать HTML Tidy и настоящий парсер.

Спасибо за предложения.

0 голосов
/ 09 января 2010

Если вы должны использовать регулярное выражение, используйте .*? вместо .*. *? является нежадной версией *; то есть, вместо того, чтобы соответствовать как можно большему, оно соответствует как можно меньшему.

(Кстати, не пытайтесь сопоставлять HTML или XML с регулярными выражениями ; этот путь лежит безумие . Вместо этого попробуйте использовать HTML или XML анализатор. Если у вас нет анализатора HTML, запустите его через HTML Tidy и используйте анализатор XML. См. ответ meder , чтобы узнать, как это сделать. в PHP.).

0 голосов
/ 09 января 2010

в одну сторону

$str= <<<A
blah blah
blah
...
<a class="fetch-me" href="products/1">Find ME!!!</a>
<a class="fetch-me" href="products/2">Me too!</a>
blah
blah
<a class="fetch-me"
          href="products/1">Find me, i am at next line!!!</a> blah blah
A;
$s = explode("</a>",$str);
foreach ($s as $k ){
    if (strpos($k,"href" ) !==FALSE ){
        print "--> ". preg_replace("/^.*href=\".*\">|\">.*/sm","",$k)."\n";
    }
}

выход

$ php test.php
--> Find ME!!!
--> Me too!
--> Find me, i am at next line!!!

В идеале вы должны использовать реальный парсер, как все говорили.

0 голосов
/ 09 января 2010

Как насчет чего-то вроде:

/<a[^>]*([^<]*)<\/a>/siU
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...