Preg_replace_all链接到markdown格式

时间:2011-04-29 19:08:41

标签: php markdown

在我们使用“内部”系统之前,我们正在转换为降价,其中图像链接和所有数据(例如alt)在另一个括号中。

例如{IMAGE LINK}[OPTIONAL ALT WITH OTHER DATA]

现在我们正在转向markdown,(我们的数据存储为数据库中的markdown),我需要将所有内容转换为markdown:

那么如何将{LINK}[OPTIONAL DATA]的所有实例(不需要方括号,有些只是{})转换为等同于降价的实例:

基本上,

{http://www.youtube.com/image.gif}[this is optional alt] INTO  ![alt](http://www.youtube.com/Image.gif)

到目前为止我有以下内容,但是我是否处理了可选的[ALT DATA]标签?

   if (preg_match_all('/\[(.*?)\]/i', $string, $matches, PREG_SET_ORDER)) 
   {


   }

4 个答案:

答案 0 :(得分:1)

要处理可选的alt属性,您应该使用preg_replace_callback。这允许您测试alt attr的存在并在必要时添加它。

$str = '
This is an image {http://www.youtube.com/image.gif}[this is optional alt]
This is an image with an alt attribute {http://www.youtube.com/image.gif}
';

echo preg_replace_callback(
    '~{(http://[^s]+)}(?:\[(.*?)\])?~',
    function($m){
        if ( isset( $m[2] ) ) {
            return $img = sprintf( '![%s](%s)', $m[2], $m[1] );
        }
        return $img = sprintf( '(%s)', $m[1] );
    },
    $str
);

答案 1 :(得分:0)

简单的案例是

{(.*?)}\[(.*?)\]   <-- search pattern
![\1](\2)           <-- replace pattern

但是你会被包含转义字符的链接弄乱(\{\}\[\])。这将涉及一个前瞻,你必须希望别人为你写信。但是,如果这只是图像URL,则不应该有太多(如果有)实例。

答案 2 :(得分:0)

我会将preg_replace_callback用于此目的。在那里探测可选的alt标签和/或构建替代品更容易。

 $source = preg_replace_callback('#
        \{  (http://[^}\s]+)  \}  
        (?:                        
          \[ ([^\]{}\n]+) \]        
        )?
     #x',
     "cb_img_markdown",
     $source);

 function cb_img_markdown($m) {
     list($asis, $link, $alt) = $m;
     if (!strlen($alt)) {
         $alt = "image " . basename($link);
     }
     return "![$alt]($link)";
 }

您还可以使链接更严格,以避免误报。在这里,我只是依赖http://存在,但你可以追加,例如(?:png|jpe?g|gif)以确保它只匹配图片网址。

答案 3 :(得分:0)

在PHP中解析标签是如此忙碌, 我建议您使用此PHP Simple HTML DOM Parser

解析任何类型的标签非常容易,您也可以轻松地按属性进行过滤。