我必须将旧网站转换为CMS,我遇到的挑战之一是目前有900多个文件夹,每个文件夹中最多包含9个文本文件。我需要将最多9个文本文件合并为一个,然后将该文件用作导入CMS。
文件串联和导入工作正常。
我遇到的挑战是解析文本文件中的一些文本。
文本文件包含
形式的网址Some text [http://xxxxx.com|About something] some more text
我正在使用此代码转换此内容
if (substr ($line1, 0, 7) !=="Replace") {
$pattern = '/\\[/';
$pattern2 = '/\\]/';
$pattern3 = '/\\|/';
$replacement = '<a href="';
$replacement3 = '">';
$replacement2='</a><br>';
$subject = $line1;
$i=preg_replace($pattern, $replacement, $subject, -1 );
$i=preg_replace($pattern3, $replacement3, $i, -1 );
$i=preg_replace($pattern2, $replacement2, $i, -1 );
$line .= '<div class="'.$folders[$x].'">'.$i.'</div>' ;
}
它可能不是最有效的代码,但它可以工作,因为这是一次性练习执行时间等不是问题。
现在我似乎无法编码的问题。文本文件中的某些网址采用此格式
Some text [http://xxxx.com] some more text
我上面的模式匹配找到了pattern和pattern2,但由于没有pattern3,url在输出中格式不正确。
正则表达式不是我的强项是否有一种方法可以修改我上面的内容,或者是否有其他方法可以在我的输出中获取格式正确的URL或者我是否需要再次解析输出以查找格式错误的URL和在将其写入输出文件之前纠正它?
答案 0 :(得分:1)
您可以使用preg_replace_callback()
来实现此目标:
[...]
explode()
通过分隔符|
拆分它们
[...]
字符串包含两个部分:链接href和链接锚文本[...]
字符串仅包含链接href部分<强>代码:强>
$input = <<<EOD
Some text [http://xxxxx.com|About something] some more text
Some text [http://xxxx.com] some more text
EOD;
$output = preg_replace_callback('#\[([^\]]+)\]#', function($m)
{
$parts = explode('|', $m[1]);
if (count($parts) == 2)
{
return sprintf('<a href="%s">%s</a>', $parts[0], $parts[1]);
}
else
{
return sprintf('<a href="%1$s">%1$s</a>', $m[1]);
}
}, $input);
echo $output;
<强>输出:强>
一些文字About something更多文字
一些文字 http://xxxx.com更多文字