【问题标题】:Need help getting string from a file in PHP需要帮助从 PHP 文件中获取字符串
【发布时间】:2017-05-07 03:48:18
【问题描述】:

我有一个包含 html 代码的 txt 文件。我正在尝试创建一个 PHP 页面来搜索代码并为我获取“用户名”:

这是页面的一个小示例:

  <div class="search-result-details">
    <div class="employee-name">This is my name!</div>
    <ul class="employee-details">
      <li><span class="label">Login</span>username</li>
      <li><span class="label">Employee ID</span>####</li>
      <li><span class="label">Barcode ID</span>###</li>
      <li><span class="label">Status</span>Active</li>
    </ul>
    <ul class="org-details">
      <li><span class="label">Location</span>SAT1 (755)</li>
      <li><span class="label">Shift</span>AAAA</li>
      <li><span class="label">Department</span>1231</li>
      <li><span class="label">Area</span>26</li>
      <li><span class="label">Crew</span>0</li>
      <li><span class="label">Supervisor</span>manager name</li>
    </ul>
  </div>
</a></li>
                    </ol>
                </div>

我需要从以下行获取用户名:

<li><span class="label">Login</span>username</li>

我已经有了这个,至少可以抓住我需要的线:

    <?php
$file = 'log.txt';
$searchfor = '<ul class="employee-details">
      <li><span class="label">Login</span>';

// the following line prevents the browser from parsing this as HTML.
header('Content-Type: text/plain');

// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($file);
// escape special characters in the query
$pattern = preg_quote($searchfor, '/');
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
   echo "Found matches:\n";
   echo implode("\n", $matches[0]);
}
else{
   echo "No matches found";
}

?>

电流输出:

<ul class="employee-details">
  <li><span class="label">Login</span>username</li>

非常感谢任何帮助。谢谢。

【问题讨论】:

  • 我更喜欢用 DOMDocumentDOMXpath 解析 HTML 文件,也许它也是你的

标签: php string


【解决方案1】:

虽然有点老套,但这是您可以做到的一种方式。

$contents = file_get_contents($file);

preg_match("/(Login<\/span>)([a-zA-Z0-9]*)(<\/li>)/", $contents, $matches);

if (is_array($matches) && isset($matches[2])) {
   $username = trim($matches[2]);
}

当然,中间捕获组需要支持用户名中可能出现的任何字符。

另外请注意,如果 HTML 结构发生变化,这将中断

最后,如果一个文件中可以有多个用户名,您可以使用preg_match_all,然后$matches[2] 将是一组用户名。

【讨论】:

    【解决方案2】:

    使用 DOMDocument:

    $doc = new DOMDocument();
    libxml_use_internal_errors(true);
    $doc->loadHTML('<div class="search-result-details">
        <div class="employee-name">This is my name!</div>
        <ul class="employee-details">
          <li><span class="label">Login</span>username</li>
          <li><span class="label">Employee ID</span>####</li>
          <li><span class="label">Barcode ID</span>###</li>
          <li><span class="label">Status</span>Active</li>
        </ul>
        <ul class="org-details">
          <li><span class="label">Location</span>SAT1 (755)</li>
          <li><span class="label">Shift</span>AAAA</li>
          <li><span class="label">Department</span>1231</li>
          <li><span class="label">Area</span>26</li>
          <li><span class="label">Crew</span>0</li>
          <li><span class="label">Supervisor</span>manager name</li>
        </ul>
      </div>
    </a></li>
                        </ol>
                    </div>');
    libxml_use_internal_errors(false);
    
    $html = new DOMXPath($doc);
    $result = '';
    foreach ($html->query("//*[@class='label']") as $value) {
        if ($value->textContent == 'Login') {
            $result = $value->nextSibling->textContent;
            break;
        }
    }
    
    echo $result;
    

    输出:

    username
    

    libxml_use_internal_errors 的原因是为了抑制 this answer 中所述的验证错误。

    【讨论】:

    • @dkeeper09 和你现在一样,file_get_contents
    猜你喜欢
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多