我有几百个 html 文件想要在网站上显示。 它们都包含以下格式的链接:
[My Test URL|https://www.mywebsite.com/test?param=123]
问题是一些网址被分割成这样:
[My Test URL|https://www.mywebsite.c om/test?param=123]
我想用 HTML 对应部分替换所有这些:
<a href="https://www.mywebsite.com/test?param=123">My Test URL</a>
我知道使用正则表达式“/[(.*?)]/”我可以匹配括号,但如何通过管道分割、删除 URL 中的空格并将所有内容转换为字符串?
最佳答案
如果您只想删除这些 Markdown 链接中 URL 部分的(空白)空格,您可以仅使用 preg_replace
,例如
preg_replace('~(?:\G(?!\A)|\[[^][|]*\|)[^][\s]*\K\s+(?=[^][]*])~', '', $text)
请参阅regex demo 。 详细信息:
(?:\G(?!\A)|\[[^][|]*\|)
- 上一场比赛的结束或[
,然后是除[
、]
和|
之外的零个或多个字符,然后是|
char[^][\s]*
- 除[
、]
和空格之外的零个或多个字符\K
- 丢弃迄今为止匹配的所有文本\s+
- 一个或多个空格(?=[^][]*])
- 除[
和]
之外,必须有零个或多个字符,然后紧邻当前位置右侧的]
。
如果你想删除 URL 部分中的空格并将 markdown 转换为 HTML,你最好使用 preg_replace_callback
:
$text = '[My Test URL|https://ww w.mywebsite.c om/t est?param=123]';
echo preg_replace_callback('/\[([^][|]*)\|([^][]+)]/', function($m) {
return '<a href="' . str_replace(' ', '', $m[2]) . '">' . $m[1] . '</a>';
}, $text);
请参阅PHP demo 。 详细信息:
\[
- 一个[
字符([^][|]*)
- 第 1 组:除[
、]
和之外的任何零个或多个字符>|
\|
-|
字符([^][]+)
- 第 2 组:除]
和[
之外的任何一个或多个字符
]
-]
字符。
关于PHP 用 URL 替换字符串中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70534848/