使用 preg_replace 创建可选的 alt img 属性

Make optional alt img attribute using preg_replace

我正在使用此代码

echo preg_replace('#\{{2}(.*?)\}{2}#', '<img src="/base/">', $input);

要显示这样的输入:

foo foo {{picture.jpg}} foo

在 img html 标签中。 我想以这种格式添加一个可选的 alt 属性:

{{picture.jpg|optional}}

并翻译成:

<img src="/base/" alt="">

只有存在,不做另一个preg_replace,只改进现有的。

我该怎么做?

因为你只禁止使用另一个 preg_replace 而不是另一个正则表达式,所以这个有效:

preg_replace(['#\{{2}(.*?)\|(.*?)\}{2}#', '#\{{2}(.*?)\}{2}#'], ['<img src="/base/" alt="">', '<img src="/base/">'], $input);

工作示例:

function replacer($input) {
    return preg_replace(['#\{{2}(.*?)\|(.*?)\}{2}#', '#\{{2}(.*?)\}{2}#'], ['<img src="/base/" alt="">', '<img src="/base/">'], $input);
}

echo replacer('{{picture.jpg}}');
echo replacer('{{picture.jpg|optional}}');

输出:

<img src="/base/picture.jpg">
<img src="/base/picture.jpg" alt="optional">

你可以使用

{{(.+?)(?:\|([^}]+))?}}

参见 a demo on regex101.com


PHP 中,在 preg_replace_callback() 的帮助下将是:

<?php

$string = <<<DATA
foo foo {{picture.jpg}} foo
{{picture.jpg|optional}}
DATA;

$regex = '~{{(.+?)(?:\|([^}]+))?}}~';

$string = preg_replace_callback($regex, 
    function($match) {
        if (!empty($match[2])) {
            return "<img src='/base/{$match[1]}' alt='{$match[2]}'>";
        } else {
            return "<img src='/base/{$match[1]}'>";
        }
}, $string);

echo $string;

这会产生

foo foo <img src='/base/picture.jpg'> foo
<img src='/base/picture.jpg' alt='optional'>