PHP 用 URL 替换字符串中的模式

PHP replace patterns in string with URLs

我有几百个 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 中的空格并将所有内容转换为字符串?

如果要从 php 中的字符串中删除所有 WHITESPACES,您需要做的就是:

$string = str_replace(' ', '', $string);

其中 $string 是带有 url 的字符串。

我想这会为你做的

$html = "[My Test URL|https://www.mywebsite.c om/test?param=123] [My Test URL|https://www.mywebsite.com/test?param=123]";
$html = preg_replace_callback("|\[.*?\|.*?\]|", function($matches){
    list($anchor, $link) = explode("|",substr($matches[0], 1, -1));
    return "<a href='".str_replace(' ', '', $link)."'>$anchor</a>";
}, $html);

echo $html;
// echos  <a href="https://www.mywebsite.com/test?param=123">My Test URL</a> <a href="https://www.mywebsite.com/test?param=123">My Test URL</a>

如果您只想删除这些降价链接中 URL 部分的(空白)空格,您可以仅使用 preg_replace 之类的

preg_replace('~(?:\G(?!\A)|\[[^][|]*\|)[^][\s]*\K\s+(?=[^][]*])~', '', $text)

regex demo详情:

  • (?:\G(?!\A)|\[[^][|]*\|) - 上一场比赛结束或 [,然后是 []| 以外的零个或多个字符,然后是| 字符
  • [^][\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 组:除 ][
  • 之外的任何一个或多个字符
  • ] - 一个 ] 字符。