Php 使用preg#u replace时,如果$2不',则仅使用$1(在替换中);不存在
我目前正在使用此代码片段将文本从Php 使用preg#u replace时,如果$2不',则仅使用$1(在替换中);不存在,php,preg-replace,Php,Preg Replace,我目前正在使用此代码片段将文本从[[foo]]更改为完整的HTMLa链接 $var = preg_replace('/\[\[((.*?)(\|(.*?))?)\]\]/', '<a href="https://foobar.com/$1">$1</a>', $var); 我在想怎么处理这件事时遇到了点麻烦,希望你们能帮上忙 提前谢谢 您可以使用并测试回调中是否存在第二个匹配项(如果第一个匹配项不存在,则返回到第一个匹配项): $var='[[foo
[[foo]]
更改为完整的HTMLa
链接
$var = preg_replace('/\[\[((.*?)(\|(.*?))?)\]\]/', '<a href="https://foobar.com/$1">$1</a>', $var);
我在想怎么处理这件事时遇到了点麻烦,希望你们能帮上忙
提前谢谢 您可以使用并测试回调中是否存在第二个匹配项(如果第一个匹配项不存在,则返回到第一个匹配项):
$var='[[foo | bar]];
$var=preg\u replace\u回调(
'/\[\[(?.*?)(?:\|(?.*?))?]]/',
静态函数(数组$matches):字符串{
$uri=$matches['uri'];
$text=$matches['text']??$uri;
返回“”;
},
$var
);
echo$var;//
注意:我随意稍微修改/优化了您的正则表达式(删除不需要的捕获括号、反斜杠,并添加一些命名捕获)。您可以在回调中使用并测试是否存在第二个匹配项(如果不存在,则返回到第一个匹配项):
$var='[[foo | bar]];
$var=preg\u replace\u回调(
'/\[\[(?.*?)(?:\|(?.*?))?]]/',
静态函数(数组$matches):字符串{
$uri=$matches['uri'];
$text=$matches['text']??$uri;
返回“”;
},
$var
);
echo$var;//
注意:我随意稍微修改/优化了您的正则表达式(删除不需要的捕获括号、反斜杠,并添加一些命名捕获)。@penguinstyles您取消选中此答案的原因是什么?@penguinstyles您取消选中此答案的原因是什么?
<a href="https://foobar.com/$1">$2</a>
$var = '[[foo|bar]]';
$var = preg_replace_callback(
'/\[\[(?<uri>.*?)(?:\|(?<text>.*?))?]]/',
static function (array $matches): string {
$uri = $matches['uri'];
$text = $matches['text'] ?? $uri;
return "<a href=\"https://foobar.com/{$uri}\">{$text}</a>";
},
$var
);
echo $var; // <a href="https://foobar.com/foo">bar</a>