Find/Replace PHP 中的部分文本并转换为 HTML

Find/Replace part of text in PHP and convert to HTML

我有大量的 ASCII 文本文件,我正在使用以下代码列出每个文件的内容:

<?php
$file = $_GET['file'];
$orig = file_get_contents($file);
$a =htmlentities($orig);
echo $a;
?>

每个 ASCII 文件中的一些文本字符串是对其他文件的文件名的引用,我正在尝试查找并用 Hyperlink 替换它们以那个文件。

例如,一个文本文件可能被称为 "LAB_E143.txt",如下所示:

LAB_E143:
        LDX   $#FF          ; load X with $FF
        JSR   LAB_E151      ; jump to this location

而我要查找和替换的是以 "LAB_" 开头的引用(例如上例中的 LAB_E151),以便将文本显示为 Hyperlink href 为:

http:\capture.php?file=lab_e151.txt

单击 link 将显示该特定文本文件的内容等。 所有参考文献均以 "LAB_" 开头,后跟 4 个可变字符

我试过 str_replace 但每次都很难解析 4 个可变字符。

非常感谢任何帮助/指点

对于这种情况,您应该使用 Regex。正如颤抖所提到的,preg_replace_callback 应该是用于此目的的最佳函数。

  1. 使用以下正则表达式检测所有引用:/LAB_(?<id>\S{4})/
  2. 写一个函数用 <a> 标签替换匹配项

就是这样。

$text = 'LAB_8435 Lorem ipsum dolor sit amet. LAB_8337 Amet.';

$formattedText = preg_replace_callback('/LAB_(?<id>\S{4})/',  function ($matches) {
    return '<a href="/capture.php?id='.$matches[1].'">'.$matches[0].'</a>';
}, $text);

echo $formattedText;

警告:您想要显示来自特定文件夹的文件 - 确保用户不能更改提供的字符串(文件白名单、文件名清理)的路径,因为它会有可能造成一些严重的损害。

我建议不要给出 link 与包含的文件名直接相关的线索。相反 /capture.php?file=lab_e151.txt 你可能有 /capture.php?id=e151 然后是这样的:

$id = isset($_GET['id']) ? $_GET['id'] : ''; //in php7: $id = $_GET['id'] ?? ''; 
if (!preg_match('/[0-9A-Za-z]{4}/', $id)) { die('Invalid link'); }
$file = 'lab_' . $id . '.txt';

//...

$convertToLink = function ($matches) {
    return '<a href="/capture.php?id=' . strtolower($matches[1]) . '">' . $matches[0] . '</a>';
};

$code = preg_replace_callback('/LAB_([0-9A-Za-z]{4})/', $convertToLink, $string);

echo '<pre>' . $code . '</pre>';

如果这 4 个字符是十六进制数,那么您可以改用此模式:/LAB_([0-9A-Fa-f]{4})/