在我们使用“内部”系统之前,我们正在转换为降价,其中图像链接和所有数据(例如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))
{
}
答案 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
解析任何类型的标签非常容易,您也可以轻松地按属性进行过滤。