【问题标题】:PHP preg_match captures not working as expectedPHP preg_match 捕获未按预期工作
【发布时间】:2020-02-19 02:53:05
【问题描述】:
<?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 元素 &lt;span ...&gt;...&lt;/span&gt;(用 ... 替换 $html 变量中的内容)。

我查看了多个主题和文档,但找不到任何可以回答我的问题的内容。

这是我执行它时的样子

我不是在尝试获取元素,而是在 Right Here 中获取文本

【问题讨论】:

  • 这里的“右边”是什么意思?您希望匹配每个垃圾邮件标签内的文本,还是只匹配第一个?

标签: php html regex preg-match


【解决方案1】:

DOMDocumentDOMXPath 是在 PHP 中解析 HTML 更合适的方式:

$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

Demo on 3v4l.org

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多