将分隔符内的文本转换为有效的URL

时间:2014-03-31 06:54:53

标签: php regex

我必须将旧网站转换为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和在将其写入输出文件之前纠正它?

1 个答案:

答案 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更多文字

Live demo