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 应该是用于此目的的最佳函数。
- 使用以下正则表达式检测所有引用:
/LAB_(?<id>\S{4})/
- 写一个函数用
<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})/
我有大量的 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 应该是用于此目的的最佳函数。
- 使用以下正则表达式检测所有引用:
/LAB_(?<id>\S{4})/
- 写一个函数用
<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})/