PHP Извлечение части строки, если найдено - PullRequest
1 голос
/ 13 октября 2019

Я очищаю веб-сайт и нахожу строку, затем, когда эта строка будет найдена, я буду извлекать часть этой строки.

Я ищу строку «twitter: image» на веб-сайтетогда, когда найден, я буду извлекать значение "содержимого" этого. Итак, вот пример веб-сайта, который я скребу. Это HTML-код или «Просмотр исходного кода» этого веб-сайта:

enter image description here

Вот пример моего кода: я использую библиотеку под названием «ProxyCrawl»"

$ch = new ProxyCrawl();

$response = $ch->get($link, false);

if ($response->original_status == 200) {
    $result = $response->body;
     if (strpos($result, 'name="twitter:image"') !== false) {
        Log::debug("found!");
        //then extract the content
     } else {
        //do nothing              
     }

 }

У меня уже есть код для проверки существования" twitter: image ", но у меня нет кода при извлечении значения" content ".

Любая помощьочень ценится. Спасибо!

Ответы [ 3 ]

8 голосов
/ 17 октября 2019

Если <meta name="twitter:image" /> является уникальным элементом на странице, используйте это:

$ch = new ProxyCrawl();
$response = $ch->get($link, false);

if ($response->original_status == 200) {
    $dom = new DOMDocument;
    $dom->loadHTML($response->body);
    $xpath = new DOMXpath($dom);

    $element = $xpath->query("//meta[@name='twitter:image']/@content");

    if (!empty($element->item(0))) {
        $imageUrl = $element->item(0)->nodeValue;
    }
}

В противном случае, если есть несколько элементов такого рода, вам нужно будет выполнить итерацию:

$ch = new ProxyCrawl();
$response = $ch->get($link, false);

if ($response->original_status == 200) {
    $dom = new DOMDocument;
    $dom->loadHTML($response->body);
    $xpath = new DOMXpath($dom);

    $imageUrls = [];
    $elements = $xpath->query("//meta[@name='twitter:image']");

    if ($elements !== false) {
        foreach ($elements as $element) {
            $imageUrls[] = $element->getAttribute('content');
        }
    }
}
0 голосов
/ 18 октября 2019

Я не знаю laravel (я использую Symfony), и я новичок в StackOverflow, но что-то вроде этого может работать:

if(strstr($result, 'name="twitter:image"')) {
  $namestart = strpos($result, 'name="twitter:image"');
  $substr1 = substr($result, $namestart);
  $contentstart = strpos($result, 'content="') + 8;
  $substr2 = substr($result, $contentstart);
  $contentend = strpos($substr, '"');
  $content = substr($result, $contentstart, $contentend)
}

Не проверено!

0 голосов
/ 13 октября 2019

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

/(name=\"twitter:image\")(.)content=\"(.+)\"/im

Это будет соответствовать строке, содержащей name="twitter:image", за которой следует content=". Вы можете получить текст контента из третьей группы:

$str = '<meta data-rl="true" name="twitter:image" content="testing"';
$regex = '/(name="twitter:image")(.)content="(.+)"/im';
preg_match_all($regex, $str, $results);
print_r($results);
  • Это грубый пример, вам придется использовать его в качестве основы для точной реализации. Есть более чистые решения для этого (и, возможно, лучше регулярные выражения), но это поможет вам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...