PHP захват preg_match работает не так, как ожидалось - PullRequest
0 голосов
/ 19 февраля 2020
<?php
$html = <<<EOD
dsfgvsdfgv
sdfgv
sdfgv
<span id="userStatusText" class="text-overflow ng-binding userstatus-editable" title="_epic Can I have Coffee" ng-class="{'userstatus-editable':profileHeaderLayout.mayUpdateStatus}" ng-bind="profileHeaderLayout.statusText|statusfilter" ng-click="revealStatusForm()">"_epic Can I have Coffee"</span>
fdgvsdfgvsdfvg
var_dumpgv
dsfgv
EOD;

preg_match("!<span.+id=\"userStatusText\".+>(.*)<\/span>!", $html, $element);

if (!$element) {
  return;
}
echo $element[0];

Я прошу прощения за зверскую переменную, но я пытаюсь извлечь _epic Can I have Coffee из строки.

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

Я хочу иметь возможность захватывать текст внутри (. *), Который не работает.

При выполнении preg_match я все равно получу только элемент span <span ...>...</span> (замените ... содержимое переменной $ html).

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

Вот как это выглядит, когда я его выполняю enter image description here

Я не пытаюсь получить элемент, но получаю текст внутри Right Here

1 Ответ

1 голос
/ 19 февраля 2020

DOMDocument и DOMXPath являются более подходящим способом анализа HTML в PHP:

$html = <<<EOD
dsfgvsdfgv
sdfgv
sdfgv
<span id="userStatusText" class="text-overflow ng-binding userstatus-editable" title="_epic Can I have Coffee" ng-class="{'userstatus-editable':profileHeaderLayout.mayUpdateStatus}" ng-bind="profileHeaderLayout.statusText|statusfilter" ng-click="revealStatusForm()">"_epic Can I have Coffee"</span>
fdgvsdfgvsdfvg
var_dumpgv
dsfgv
EOD;

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
foreach ($xpath->query('//span[@id="userStatusText"]') as $span) {
    echo $span->getAttribute('title');
}

Вывод:

_epic Can I have Coffee

Демонстрация на 3v4l.org

...