2014-03-31 16 views
1

我必须将旧网站转换为CMS,并且我目前遇到的其中一个难题是目前有900多个文件夹,每个文件夹中最多包含9个文本文件。我需要将最多9个文本文件合并为一个,然后将该文件用作导入CMS的文件。将delimeters中的文本转换为有效的url

文件连接和导入工作正常。

我面临的挑战是解析文本文件中的一些文本。

文本文件包含在

Some text [http://xxxxx.com|About something] some more text 

我用这个代码转换这种格式的URL

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>' ; 
} 

它可能不是最有效的代码,但它的工作原理,并因为这是一次性锻炼执行时间等不是问题。

现在,我似乎无法编码的问题。一些文本文件的URL的都是这种格式

Some text [http://xxxx.com] some more text 

模式匹配,我有以上发现模式和模式2,但因为没有pattern3的URL在输出格式不正确。

正则表达式不是我的特长有没有办法来修改我上面有什么或有另一种方式来在我的输出中获得格式正确的url或将需要解析输出第二次寻找格式不正确的url并在将其写入输出文件之前进行更正?

+0

所以你需要通过'http:// xxxx.com'吧? –

回答

1

您可以使用preg_replace_callback()来实现这一目标:

  • 找到格式[...]
  • 尝试使用explode()
    • 如果分割数组包含两片分隔符|分裂他们的任何字符串,那么这意味着[...]字符串包含两部分:链接href和链接锚文本
    • 如果不是,那么它意味着t他的[...]串仅包含链接的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

+1

非常感谢你,完美的作品。 – Colin